nestjs - 如何在nest.js中使用grpc原型(prototype)类型Struct

标签 nestjs grpc grpc-node

嘿,我正在尝试使用 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/

相关文章:

protocol-buffers - 如何区分grpc服务中未提供的数组和空数组?

node.js - 在 Node.js gRPC 客户端中获取 `Error: 8 RESOURCE_EXHAUSTED: Received message larger than max (15217288 vs. 4194304)`

node.js - 使用 Sequelize 将数据插入 SQLITE DB 时,由于 "file change"导致开发服务器自行重启,MySQL 不会发生 [包括 repo ]

node.js - 在 Nest.js 中创建动态模块时,我应该使用 registerAsync 还是 forRootAsync?

php - 谁能帮我从 Google Ads API 调试 "proto descriptor was previously loaded"

java - Grpc.Core.RpcException 方法未使用 C# 客户端和 Java 服务器实现

node.js - 公司防火墙/代理后面的 Firestore/gRPC

mongoose - 如何在 Nestjs 中读取 MongooseModule 上的 .env 文件?

swagger - 使用 swagger 4.x 包生成 swagger 2.0 yaml

go - 使用 gRPC 解析(解码)由 ALB 触发的 AWS lambda 请求正文