grpc服务中如何区分未提供和空数组?

How to distinguish not provided and empty array in grpc service?

参见 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;
}

如果您使用默认选项加载包,则客户端无法删除

的项目
client.CRUD.updateTable({a: []})

因为参数{a: []}到达服务器端后变成了{}

如果您使用选项 {arrays: true} 加载包,那么字段 a 将被无意中清除,而客户端只会尝试更新其他字段:

client.CRUD.updateTable({b: 'updated value'}) 

因为参数{b: 'updated value'}到达服务器端后变成了{a: [], b: 'updated value'}

关于如何使用 grpc-nodeproto3 处理这两种情况,谁能分享一些更好的想法?

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

为了区分这两种情况,您需要在原型消息中传递额外的信息。

我强烈建议阅读此处的设计文档:https://developers.google.com/protocol-buffers