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-node
和 proto3
处理这两种情况,谁能分享一些更好的想法?
protobuf 编码不区分这两种情况。由于 protobuf 与语言无关,因此它不理解 "undefined" 与 Javascript 的“[]”的概念上的细微差别。
为了区分这两种情况,您需要在原型消息中传递额外的信息。
我强烈建议阅读此处的设计文档:https://developers.google.com/protocol-buffers
参见 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-node
和 proto3
处理这两种情况,谁能分享一些更好的想法?
protobuf 编码不区分这两种情况。由于 protobuf 与语言无关,因此它不理解 "undefined" 与 Javascript 的“[]”的概念上的细微差别。
为了区分这两种情况,您需要在原型消息中传递额外的信息。
我强烈建议阅读此处的设计文档:https://developers.google.com/protocol-buffers