首页 > 解决方案 > NodeJS Buffer.write() 在写入索引 >= 100,000 时返回 0

问题描述

main.js
        global.buff = Buffer.alloc(100010)
        global.index = 0

buffer.js
        bytes_written = global.buff.write(data, global.buff_idx)
        global.buff_idx += bytes_written

在 nodeJS 中,Buffer.write() 通常返回写入缓冲区的字节数。当我尝试写入任何 >= 100,000 的索引时,它返回 0。我读到最大缓冲区大小为 1GB(32 位)和 2GB(64 位),所以我认为这不是问题。

日志说:

index before: 95142  offset: 1605  index after: 96747
index before: 96747  offset: 2195  index after: 98942
index before: 98942  offset: 1058  index after: 100000
index before: 100000 offset: 0     index after: 100000
index before: 100000 offset: 0     index after: 100000

标签: javascriptnode.jsdata-structuresbuffernodes

解决方案


我有一个使用 15MB 缓冲区的项目,所以 100,010 字节完全没有问题。

我写这个作为一个答案,这样我就可以向你展示我编写的代码,并且这个代码在完全独立运行时工作得很好:

global.buff_idx = 0;
global.buff = Buffer.alloc(100010);

let data = "12345";

let bytes_written = global.buff.write(data, global.buff_idx);
global.buff_idx += bytes_written;
console.log(bytes_written);

它记录5了您所期望的。

为了让我们进一步帮助您,您需要发布一个Minimal, Reproducible Example


仅供参考,我还尝试将相同的代码拆分为您显示的两个文件。没有不同。除了您显示的代码之外,还有其他原因导致您的环境出现问题。


而且,还有一点:

在 node.js 中,对缓冲区的整个全局使用是可憎的。将共享缓冲区封装在一个模块中,让每个想要使用共享缓冲区的文件导入您的缓冲区模块以访问共享缓冲区。这就是你应该在 node.js 中编码的方式,而不是像这样使用全局变量。


推荐阅读