6

请参阅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吗?

4

1 回答 1

6

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

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

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

于 2019-11-27T18:28:01.020 回答