【发布时间】:2019-11-27 06:13:20
【问题描述】:
见https://github.com/grpc/grpc-node/issues/1202。
通常在 CRUD 操作中,未提供的值表示不更改该字段,空数组 [] 表示清除该字段内的所有项。
但是如果你尝试实现 CRUD 操作并通过 grpc 将它们作为服务提供,那么上面的场景很难实现。
service CRUD {
rpc updateTable(updateRequest) returns updateResponse {}
}
message updateRequest {
repeated string a = 1;
string b = 2;
}
message updateResponse {
boolean success = 1;
}
如果使用默认选项加载包,则客户端无法删除 a 的项目
client.CRUD.updateTable({a: []})
因为参数{a: []}在到达服务器端时变成了{}。
如果您使用选项 {arrays: true} 加载包,则字段 a 将被无意中清除,而客户端仅尝试更新其他字段:
client.CRUD.updateTable({b: 'updated value'})
因为参数{b: 'updated value'}在到达服务器端时变成了{a: [], b: 'updated value'}。
谁能分享一些关于如何使用grpc-node 和proto3 处理这两种情况的更好的想法?
【问题讨论】:
-
Protobuf 没有“空/空”或数组的概念。它只是“重复”,而重复零次的内容很简单:从输出中完全省略(警告:从技术上讲,可以对零计数的“打包”原语进行编码;不确定主编码器是否这样做,并且:很多重复的数据不是原语)。我的观点:没有简单的答案,除了可能是第二个字段来表明您的意图。
标签: protocol-buffers grpc-node