(g)rpc是否支持动态对象作为参数?

时间:2017-03-13 18:58:08

标签: javascript node.js rpc grpc

我正在编写一个RPC函数,该函数从MongoDB返回一个对象,用户可以在调用中定义返回的参数。问题是我似乎无法找到如何定义一个动态的'原型中的对象。我找到的所有示例都基于一个静态的对象,所有参数都在.proto文件中设置。 RPC函数如下所示:

function fetch(call, callback) {
  ObjectSvc.getById(call.request.id, call.request.parameter, (err, object) => {
    if (err) {
      log.error(err);
      callback(err);
    } else {
      callback(null, object);
    }
  });
};

我的.proto定义如下所示:

package object;

service Object{
  rpc fetch (queryReq) returns (objectRes) {}
}

message queryReq {
  string id = 1;

  string parameters = 2;
}

message objectRes {
  // what should I write here?
}

我知道我可以将结果设置为字符串,只是 stringify 整个对象,但这是预期的方式吗?是不是有更好的(更多'正确')方式来做到这一点?或者我每次都会返回(也许)大屁股字符串?这似乎有点不理想。

1 个答案:

答案 0 :(得分:1)

最简单的选择确实是在服务器上对对象进行字符串化并反转客户端上的进程。

一种可能的替代方法是使用google.protobuf.Struct消息类型,它可以表示任意JSON等效对象。不幸的是,该类型不会自动转换为(或来自)常规JavaScript对象,因此您必须使用实际的值对象。另外,您应该记住,在使用Struct类型时,必须存储整个消息结构,因此您甚至不能指望它明显小于JSON表示。