我正在使用 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,不会引发异常。我还在实际代码中从我的 onmessage 方法调用 testProtobuf。在这种情况下,仍然会抛出异常。如您所见,我在控制台上记录缓冲区。两个日志是相同的(我确保测试数据相同)。
这是 Chrome 控制台:Chrome 中的控制台输出