当前位置: 首页 > 知识库问答 >
问题:

带有Typescript详细信息的节点gRPC

易流觞
2023-03-14

我试图在Typescript中设置一个节点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类型RPCendpoint的操作所需的代码量。

共有1个答案

危斯伯
2023-03-14

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

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

  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();
  }
 类似资料:
  • 如何获得ec2实例详细信息(如名称、id、类型、区域、体积、平台、ondemand/reserved)和实例价格详细信息。 在cli中使用aws api并将其写成csv文件。 提前谢了。

  • 问题内容: 我正在尝试使用数据库表在Spring应用程序中应用安全性。 到目前为止,我的applicationContext-Security中有: 我对userDetailsS​​ervice的实现如下所示: 我的汇编程序如下所示: 现在,用户实体为: 我的userentitydao界面是: 实现是: 现在,当我尝试在tomcat上进行部署时,出现以下异常: 而不管我该怎么办,我不知道这是怎么回

  • 所以我有一个名为interestingpoint的类,其中包含变量'name'、'coordines'。我创建了一个包含有趣地点的列表,然后在地图上添加标记,如下所示: 所以主要的问题是,当我点击任何标记时,我可以获得它的细节吗?当我点击标记时,我想显示那个地方的描述和图片。

  • 在当前版本中,您不仅可以查看AssetBundle文件的包含资源信息和依赖关系信息,同时还可以查看每种资源的详细使用信息。目前,UWA资源检测服务对于主流资源的支持如下: 纹理资源 对于纹理资源,UWA可以提供以下重要信息:分辨率、资源格式、内存占用、Mipmap功能是否开启 和 Read/Write是否开启。这些均为影响纹理文件尺寸和内存占用的重要因素。因此,我们将其在此进行详细展示,您可以对每

  • 在概览页面或警报历史记录页面中点击警报以查看其详细信息页面。在“警报详细信息”页面中,你可以查看引发警报的详细信息,将它标记为已读或未读,开启或关闭它,将它分配给成员,添加备注。当你打开此页面时,警报会自动标记为“已读”。 警报详情页面的信息 摘要 它显示警报的当前状态,以及其引发时间和结束时间。 警报详细信息 会显示警报名、警报的解释,以及 Navicat Monitor 的建议以帮助你调查和解

  • 我正在运行一个由20个节点组成的kubernetes群集。命名空间中的一个pod被重新启动。该吊舱因出口代码为137的OOM而死亡,并按预期重新启动。但我想知道pod之前运行的节点。有什么地方可以查一下日志来了解信息吗?像蒂勒,库贝勒,库贝勒等等。。。