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

Does (g)rpc support dynamic objects as parameters?

我正在编写一个 RPC 函数,它 return 是一个来自 MongoDB 的对象,用户可以在其中定义调用中的 returned 参数。问题是我似乎找不到如何在原型中定义 'dynamic' 对象。我找到的所有示例都基于一个静态对象,所有参数都在 .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 整个对象,但这是预期的方式吗?有没有更好的(和更多 'correct')方法来做到这一点?或者我应该每次 return 一个(也许)大屁股字符串?好像有点不太理想。

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

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