ts 使用 grpc ts-proto 的一点问题

查看 76|回复 3
作者:byqtxdy07   
我在 proto 文件中定义了一个 message
message ArticleUpdateReq {
  optional string title = 3;
}
当我通过 ts-proto 生成的代码作为客户端发送请求时发现:即使我客户端不传递 title 字段,在服务端接收数据的时候 title 也会有一个空字符串的默认值 "",这导致了我无法判断用户是删除了 title ,还是没有修改 title(用的 java mp ,原本是传的 null 的话就视为没有修改,传 "" 就视为删除)
我查阅了下资料,说可以写成
message ArticleUpdateReq {
  optional google.protobuf.StringValue title = 3;
}
我看了一下生成的 java 服务端生成的代码,雀氏没有默认值""了,但又出现了一个新的问题:
ts-proto 生成新的代码并发送请求报错了:
Request message serialization failure: .article.ArticleUpdateReq.title: object expected
求大佬们帮小弟看看这两个问题😙😙😙

title, message, ts-proto, 生成

sujin190   
生成的结构还有个 hasTitle 的属性吧,你看看,客户端不给 title 赋值的时候服务端接收解码这个属性返回的就是 false ,null 值不标准,需要额外信息传递不说可能有的语言无法正确处理 null 语义
XCFOX   
只能说 TypeScript 领先太多了。grpc 是带着 C/C++、Go 的包袱设计的。在 Go 中不传值就是零值,根本没办法区分 undefined 和空字符串。
能用 json 还是用 json 吧,根本不差 protobuf 那点性能。如果是服务间通讯的话试试 nats 消息中间件,实测延迟比 grpc 低,速度比 grpc 快。
byqtxdy07
OP
  
@sujin190 !我看了一眼,直接生成的 ts 代码和 java 代码都没有显式的 hasTitle 属性,java 这边 request 请求体中倒是有一个 hasField 的 api
您需要登录后才可以回帖 登录 | 立即注册

返回顶部