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

Jef*_*ian 7 protocol-buffers grpc-node

请参阅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;
}
Run Code Online (Sandbox Code Playgroud)

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

client.CRUD.updateTable({a: []})
Run Code Online (Sandbox Code Playgroud)

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

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

client.CRUD.updateTable({b: 'updated value'}) 
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以分享一些关于如何使用grpc-node和 处理这两种情况的更好的想法吗proto3

Nic*_*ble 7

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

您需要在原始消息中传递附加信息,以便区分这两种情况。

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

  • 其他语言如何区分“CRUD”操作上的“notchange”和“clear”操作?JavaScript 中使用“undefined”和“[]”来区分“notchange”和“clear”操作是不是一个糟糕的设计? (3认同)