首页 > 解决方案 > Node gRPC (proto3) how to convert AsObject type back to gRPC class

问题描述

I'm using node to communicate with a gRPC server, here is an example of generated request ts

export class GetUserByFQDNRequest extends jspb.Message { 
    getEnvironmentId(): string;
    setEnvironmentId(value: string): void;

    getFqdn(): string;
    setFqdn(value: string): void;


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

export namespace GetUserByFQDNRequest {
    export type AsObject = {
        environmentId: string,
        fqdn: string,
    }
}

and we are creating and sending a request in the following way:

 const request = new users.GetUserByFQDNRequest();
 request.setEnvironmentId(environmentId);
 request.setFqdn(fqdn);
 usersServiceClient.getUserByFQDN(request, setTimeout(timeoutMilliseconds), (err: ServiceError | null, response: users.GetUserByFQDNResponse)

I'm looking for a way to use the RequestType.AsObject type to create a request, for example:

 const request: GetUserByFQDNRequest.AsObject = {environmentId: "envID", fqdn: "fqdn"};

but unfortunately I can't use it in my usersServiceClient.getUserByFQDN since I'm getting the following error:

TS2345: Argument of type 'AsObject' is not assignable to parameter of type 'GetUserByFQDNRequest'

in the generated ts file there is a static method which convert the request to AsObject:

static toObject(includeInstance: boolean, msg: GetUserByFQDNRequest): GetUserByFQDNRequest.AsObject;

but sadly not the other way around.

Is there any way to convert AsObject to a request class without building a converter for each type of a gRPC request?

标签: node.jstypescriptgrpcproto3

解决方案


推荐阅读