Я использую protobufjs для управления своими данными через API. В большинстве случаев он отлично работает, но в одном случае сообщения я получаю исключение «незаконный буфер». Это вызвано каким-то внутренним кодом в библиотеке. Я вставляю сюда визуализацию отладчика Chrome, остановленную в точке останова в операторе throw.
Вывод отладчика Chromer
Как видите, Chrome сообщает мне, что буфер действительно представляет собой массив Uint8Array (755 байт). Почему оператор if разрешается в false и вызывает выполнение оператора throw? И "buffer instanceof Uint8Array", и "Array.isArray(buffer)" верны.
ОБНОВИТЬ
Я написал немного кода (конечно, скопировал его из protobufjs и упростил):
function test() {
var data = new Uint8Array([10, 9, 18, 7, 99, 111, 110, 110, 101, 99, 116, 16, 1]);
testProtobuf(data);
}
function Reader(buffer) {
this.buf = buffer;
this.pos = 0;
this.len = buffer.length;
}
var create_array = function (buffer) {
console.log(buffer);
if (buffer instanceof Uint8Array || Array.isArray(buffer))
return new Reader(buffer);
throw Error("illegal buffer");
}
function testProtobuf (data) {
try {
create_array(data);
}
catch (e) { console.log('Exception')};
}
Когда я вызываю test(), который вызывает testProtobuf, который, в свою очередь, вызывает create_array, никаких исключений не возникает. Я также вызываю testProtobuf из моего метода onmessage в реальном коде. В этом случае все равно выбрасывается исключение. Как видите, я записываю буфер в консоль. Оба журнала идентичны (я убедился, что тестовые данные были одинаковыми).
Вот консоль Chrome:
вывод консоли в Chrome
Решение проблемы
Я нашел решение этой проблемы здесь:
Sample.deserializeBinary(Array.from(buffer));
И есть пример из моего машинописного кода:
const arrayBuffer = await res.arrayBuffer();
const array = new Uint8Array(arrayBuffer);
const response: Uint8Array = (Array.from(array) as unknown) as Uint8Array;
rpcImplCallback(null, response);
Комментариев нет:
Отправить комментарий