我在TypeScript前台使用Protobuf时遇到了一个奇怪的bug。我使用Axios调用REST API和protobuf.js包来处理前端的Protobuf。我刚接触protobuf,这个问题可能源于我缺乏知识。
当我使用有效负载对API进行多次调用时,问题就出现了。
例如,我想发布3个对象:object_1、object_2和object_3。因此,我提出了三个post请求。第一个请求总是被正确处理-object_1被添加到后端。然而,下面的人,为了发布object_2和object_3,再次发布了object_1。我已经调查了这个问题,并发现我的protobuf被附加到有效负载上。这意味着我在第二个请求的有效负载中有object_1和object_2,在第三个请求的有效负载中有object_1、object_2和object_3。我的接口只读取第一个object_1,也就是object_1,然后添加三次protobuf。
我使用的是文档中所述的protobuf.js包:
const message = Message.create({ message: 'hello' });
const buffer = Message.encode(message).finish();
await axios.post([...] message [...]);有没有人已经遇到过这个问题?我做错了什么?
谢谢!
发布于 2020-09-07 22:32:03
protobufjs的Writer对象使用共享的数组缓冲区。
但是axios post不会查找byteOffset和byteLength属性,而是使用整个共享缓冲区,而不仅仅是您想要的字节。
您可以像这样提取相关的字节:
const message = Message.create({ message: 'hello' });
const x = Message.encode(message).finish();
const buffer = new Uint8Array(x.buffer, x.byteOffset, x.byteLength);在我看来,protobufjs有点过时了。这是一个厚颜无耻的插件,因为我是作者,但是如果你对protobufjs不满意,请看看protobuf-ts。您可以将消息编码为二进制,如下所示:
const message = Message.create({ message: 'hello' });
const bytes: Uint8Array = Message.toBinary(message);它还可以与自动生成的Twirp客户端进行supports Angular。
https://stackoverflow.com/questions/63226813
复制相似问题