【问题标题】:How to distinguish not provided and empty array in grpc service?grpc服务中如何区分未提供和空数组?
【发布时间】: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-nodeproto3 处理这两种情况的更好的想法?

【问题讨论】:

  • Protobuf 没有“空/空”或数组的概念。它只是“重复”,而重复零次的内容很简单:从输出中完全省略(警告:从技术上讲,可以对零计数的“打包”原语进行编码;不确定主编码器是否这样做,并且:很多重复的数据不是原语)。我的观点:没有简单的答案,除了可能是第二个字段来表明您的意图。

标签: protocol-buffers grpc-node


【解决方案1】:

protobuf 编码不区分这两种情况。由于 protobuf 与语言无关,因此它无法理解“未定义”与 Javascript 的“[]”在概念上的细微差别。

您需要在 proto 消息中传递其他信息以区分这两种情况。

我强烈建议在这里阅读设计文档:https://developers.google.com/protocol-buffers

【讨论】:

  • 其他语言如何区分CRUD操作上的not changedclear操作?在 JavaScript 中使用 undefined[] 来区分 not changedclear 操作是不是一个糟糕的设计?
  • 其他语言有一个可以使用的null 版本,这似乎是一个巨大的疏忽。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多