嘿,我正在尝试使用 grpc 实现 Nest JS 微服务。 看起来不可能将 Nestjs 微服务与普通对象的结构类型一起使用。
我如何将编译后的原型(prototype)与nestjs一起使用?
imports: [
ClientsModule.register([
{
name: 'HERO_PACKAGE',
transport: Transport.GRPC,
options: {
package: 'hero',
protoPath: join(__dirname, 'hero/hero.proto'),
},
},
]),
];
我如何加载编译好的原型(prototype)。类似 https://medium.com/@waynelpu/how-to-pass-plain-javascript-object-with-gprc-94a91906ab1c
最佳答案
我可能迟到了,但我找到了答案。
假设您有以下 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 }
}
}
您现在要做的唯一一件事就是创建一个简单的函数来正确包装客户端发送的结构。 您可以在that repository上通过真实示例找到更多信息。 .
如果您需要其他任何东西或者找到更好的方法,请不要犹豫:D
关于nestjs - 如何在nest.js中使用grpc原型(prototype)类型Struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66792552/