【问题标题】:Node gRPC with Typescript verbosity具有 Typescript 详细程度的节点 gRPC
【发布时间】:2021-11-29 06:36:35
【问题描述】:

我正在尝试在 Typescript 中设置一个 Node gRPC 服务器,并且一切正常,但是处理请求/响应的冗长让我有一种不好的感觉。我遵循了https://github.com/blokur/grpc-ts-demo 的示例,这似乎是许多示例项目设置的方式。

在处理请求或响应时出现问题,并且创建的代码生成工具 (grpc_tools_node_protoc) 存根要求您像这样处理请求和响应:

  async getAllDogs(
    call: grpc.ServerWritableStream<Empty, DogEntity>,
  ): Promise<void> {
    const dogs = await dogService.repo.findAll();

    dogs
      .map((dogObj): DogEntity => {
        const dogEntity = new DogEntity();
        dogEntity.setBreed(dogObj.breed);
        dogEntity.setId(dogObj.id);
        dogEntity.setGoodBoyOrGirl(dogObj.goodBoyOrGirl);

        return dogEntity;
      })
      .forEach((dog) => {
        call.write(dog);
      });

    call.end();
  }

grpc_tools_node_protocDogEntity 生成的类型是:

export class DogEntity extends jspb.Message { 
    getId(): number;
    setId(value: number): DogEntity;
    getBreed(): string;
    setBreed(value: string): DogEntity;
    getGoodBoyOrGirl(): boolean;
    setGoodBoyOrGirl(value: boolean): DogEntity;

    serializeBinary(): Uint8Array;
    toObject(includeInstance?: boolean): DogEntity.AsObject;
    static toObject(includeInstance: boolean, msg: DogEntity): DogEntity.AsObject;
    static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
    static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
    static serializeBinaryToWriter(message: DogEntity, writer: jspb.BinaryWriter): void;
    static deserializeBinary(bytes: Uint8Array): DogEntity;
    static deserializeBinaryFromReader(message: DogEntity, reader: jspb.BinaryReader): DogEntity;
}

export namespace DogEntity {
    export type AsObject = {
        id: number,
        breed: string,
        goodBoyOrGirl: boolean,
    }
}

因此,如果消息有一堆字段,或者如果您必须编写一堆 RPC 处理程序,那么构建响应(以及客户端的请求)可能会变得非常冗长。

我想知道是否有人以提供抽象层的方式实现了这一点,以减少执行诸如设置一些 CRUD 类型 RPC 端点之类的操作所需的代码量。

【问题讨论】:

    标签: node.js typescript protocol-buffers grpc


    【解决方案1】:

    我实际上最终找到了存根代码生成的替代方法:https://github.com/stephenh/ts-proto

    这个库允许更灵活的类型,尽管它需要直接运行protoc。简而言之,对我来说的主要好处是现在可以像这样创建响应:

      async getAllDogs(
        call: grpc.ServerWritableStream<Empty, DogEntity>,
      ): Promise<void> {
        const dogs = await dogService.repo.findAll();
    
        dogs.forEach((dog) => {
          call.write(DogEntity.fromJSON(dog));
        });
    
        call.end();
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2018-03-01
      • 1970-01-01
      • 2012-03-08
      • 2017-07-29
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多