(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 表示形式小得多。
我正在编写一个 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 表示形式小得多。