【发布时间】: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_protoc 为DogEntity 生成的类型是:
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