首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf.js:编写者似乎还没有完成

Protobuf.js:编写者似乎还没有完成
EN

Stack Overflow用户
提问于 2020-08-03 17:22:19
回答 1查看 223关注 0票数 0

我在TypeScript前台使用Protobuf时遇到了一个奇怪的bug。我使用Axios调用REST API和protobuf.js包来处理前端的Protobuf。我刚接触protobuf,这个问题可能源于我缺乏知识。

当我使用有效负载对API进行多次调用时,问题就出现了。

例如,我想发布3个对象:object_1object_2object_3。因此,我提出了三个post请求。第一个请求总是被正确处理-object_1被添加到后端。然而,下面的人,为了发布object_2object_3,再次发布了object_1。我已经调查了这个问题,并发现我的protobuf被附加到有效负载上。这意味着我在第二个请求的有效负载中有object_1object_2,在第三个请求的有效负载中有object_1object_2object_3。我的接口只读取第一个object_1,也就是object_1,然后添加三次protobuf。

我使用的是文档中所述的protobuf.js包:

代码语言:javascript
复制
const message = Message.create({ message: 'hello' });
const buffer = Message.encode(message).finish();
await axios.post([...] message [...]);

有没有人已经遇到过这个问题?我做错了什么?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-07 22:32:03

protobufjs的Writer对象使用共享的数组缓冲区。

但是axios post不会查找byteOffset和byteLength属性,而是使用整个共享缓冲区,而不仅仅是您想要的字节。

您可以像这样提取相关的字节:

代码语言:javascript
复制
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。您可以将消息编码为二进制,如下所示:

代码语言:javascript
复制
const message = Message.create({ message: 'hello' });
const bytes: Uint8Array = Message.toBinary(message);

它还可以与自动生成的Twirp客户端进行supports Angular

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63226813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档