【问题标题】:how to use grpc proto type Struct in nest.js如何在 Nest.js 中使用 grpc 原型类型 Struct
【发布时间】:2021-03-25 03:16:34
【问题描述】:

嘿,我正在尝试使用 grpc 实现 Nest js 微服务。 对普通对象使用带有结构类型的 nestjs 微服务似乎是不可能的。

如何将编译后的原型与 nestjs 一起使用?

imports: [
  ClientsModule.register([
    {
      name: 'HERO_PACKAGE',
      transport: Transport.GRPC,
      options: {
        package: 'hero',
        protoPath: join(__dirname, 'hero/hero.proto'),
      },
    },
  ]),
];

如何加载已编译的原型。类似https://medium.com/@waynelpu/how-to-pass-plain-javascript-object-with-gprc-94a91906ab1c

【问题讨论】:

  • 有什么解决办法。 ?

标签: nestjs grpc grpc-node


【解决方案1】:

我可能迟到了,但我找到了答案。

假设你有以下 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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多