我可能迟到了,但我找到了答案。
假设你有以下 protobuf
// task.proto
syntax = "proto3";
// Area API
package task;
// Imports
import "google/protobuf/struct.proto";
import "google/protobuf/empty.proto";
message Task {
string name = 1;
// Any additional metadata required to execute the task
google.protobuf.Struct params = 2;
}
service TaskService {
rpc CreateTask(CreateTaskRequest) returns (Task)
}
message CreateTaskRequest {
string name = 1;
google.protobuf.Struct params = 2;
}
您需要在模块中添加一个选项以正确加载对象
await app.connectMicroservice<MicroserviceOptions>({
transport: Transport.GRPC,
options: {
package: [ 'task' ],
protoPath: [ __dirname + '/protos/task.proto' ],
url: `${host}:${port}`,
loader: {
objects: true // This property
}
},
});
然后在解析器中,你会检索到一个他的 gRPC Struct 兼容的结构,你可以找到更多information here。
现在假设您对CreateTask 执行 rpc 调用(例如 Postman 有一个很棒的 beta 客户端)
{
"name": "fugiat qui laboris dolore",
"params": {
"fields": {
"foo": {
"stringValue": "bar"
},
"bar": {
"numberValue": 4
},
"baz": {
"boolValue": false
}
}
}
}
您将在处理程序中正确检索它
async createTask(@Payload(new ValidationPipe({ whitelist: true })) req: CreateTaskRequest): Promise<Task> {
console.log(req.params)
...
}
结果
[Nest] 36410 - 02/09/2022, 3:33:33 PM LOG [NestMicroservice] Nest microservice successfully started +55ms
[Nest] 36410 - 02/09/2022, 3:33:33 PM LOG Workflow gRPC service listening on localhost:8000
[Nest] 36410 - 02/09/2022, 3:33:36 PM LOG Received rpc call to /area.task.TaskService/CreateTask with data: '{"workflowId":"1f5a0501-ce63-437d-b70f-a0ea3c22f0ff","name":"fugiat qui laboris dolore","type":0,"action":0,"nextTask":"Ut mollit","params":{"fields":{"foo":{"stringValue":"bar"},"bar":{"numberValue":4},"baz":{"boolValue":false}}}}'
{
fields: {
foo: { stringValue: 'bar' },
bar: { numberValue: 4 },
baz: { boolValue: false }
}
}
您现在唯一要做的就是创建一个简单的函数来正确包装客户端发送的 struct。
您可以在that repository 上找到更多信息和真实示例。
如果您需要其他任何东西或找到更好的方法,请不要犹豫:D