0

在我的 TypeScript 前端使用 Protobuf 时遇到了一个奇怪的错误。我正在使用 Axios 调用我的 REST API 和 protobuf.js 包以在我的前端处理 Protobuf。我是 protobuf 的新手,这个问题可能源于我缺乏知识。

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

例如,我想发布 3 个对象:object_1object_2object_3。因此,我提出了三个帖子请求。第一个请求总是被正确处理——<code>object_1 被添加到后端。但是,以下要发布的object_2object_3,正在object_1再次发布。我调查了这个问题,发现我的 protobuf 附加到了有效载荷中。这意味着我在第二个请求的有效负载和,和第三个请求的有效负载中有object_1,和。我的 API 只读取第一个 protobuf,即,并添加了 3 次.object_2object_1object_2object_3object_1object_1

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

const message = Message.create({ message: 'hello' });
const buffer = Message.encode(message).finish();
await axios.post([...] message [...]);

有没有人已经面对这个问题?我究竟做错了什么?

谢谢!

4

1 回答 1

2

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 客户端的 Angular。

于 2020-09-07T14:32:03.360 回答