【问题标题】:How to add multiple services in grpc-js server?如何在 grpc-js 服务器中添加多个服务?
【发布时间】:2021-06-09 16:20:17
【问题描述】:

假设我有 .proto 文件,如下所示:

service SvcOne{
    rpc MehtodOne(RequestOne) returns (ResponseOne) {}
}

service SvcTwo{
    rpc MethodTwo(RequestTwo) returns (ResponseTwo) {}
}

message RequestOne {
    string field_req= 1;
}

message ResponseOne {
    string field_res = 1;
}

message RequestTwo {
    string field_req= 1;
}

message ResponseTwo {
    string field_res = 1;
}

然后我尝试如下代码:

const server = new grpc.Server();      
server.addService(protoSchema.SvcOne.service, {MehtodOne: MethodOne});
server.addService(protoSchema.SvcTwo.service, {MethodTwo: MethodTwo});
server.bindAsync(
    "0.0.0.0:50051",
    grpc.ServerCredentials.createInsecure(),
    (err) => {
      if (err) {
        console.log("Error!");
      } else {
        routeServer.start();
        console.log("Server ready...");
      }
    }
  );

但出现这样的错误:

TypeError: Cannot read property 'service' of undefined

所以我认为我在两者之间遗漏了一些东西。

问题: 如何在 grpc-js 服务器中绑定多个服务(SvcOne 和 SvcTwo)?或者这在 grpc-js 中是不可能的?

【问题讨论】:

    标签: javascript node.js grpc grpc-node


    【解决方案1】:

    我为这种场景所做的是在一个 proto 文件中的自己的块上定义不同的服务。

    package servicePackage;
    
    service Service1 {
        rpc Get(Empty) returns (Empty);
        rpc Insert(Empty) returns (Empty);
        rpc Remove(Empty) returns (Empty);
        rpc Update(Empty) returns (Empty);
    }
    
    service Service2 {
        rpc Get(Empty) returns (Empty);
        rpc Insert(Empty) returns (Empty);
        rpc Remove(Empty) returns (Empty);
        rpc Update(Empty) returns (Empty);
    }
    

    然后在 addService 上使用每个服务名称

    server.addService(grpcPackage.Service1.service, {
       Insert: async (call, callback) => {
           callback(null, null);
       },
    });
    
    server.addService(grpcPackage.Service2.service, {
       Insert: async (call, callback) => {
           callback(null, null);
       },
    });
    

    绑定、protoLoading、server.start() 等其余部分保持不变。

    【讨论】:

      【解决方案2】:

      请参考route_guide_server,您是否在添加启动服务器之前加载了定义,例如this

      【讨论】:

      • 是的,在添加启动服务器之前,我会执行路由指南并加载原型定义,就像您提供的链接一样。只有在添加第二个server.addService() 时才会出现问题,如果我只使用一个server.addService(),它可以正常工作,没有任何问题。 @HelloWood
      猜你喜欢
      • 2015-12-27
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多