Writing long string to stdout in nodejs results in partial writes

问题描述 投票:0回答:0

在node js上写字符串到stdout时,如果字符串真的很长,就只写了一部分。我知道这是因为

stream.write
方法中的缓冲。为了解决这个问题,我一次写了几个字符的字符串,但我发现这不是 100% 可靠的。有时我会得到部分写入,没有错误打印到屏幕上。

起初我尝试在

process.stdout.once('drain', cb)
方法返回 false 时调用
write
,但这似乎并不总是有效。但是,它确实降低了不成功的写入率。

在某个时候,经过一个多小时的斗争,我发现如果我删除脚本末尾的

process.exit(0)
调用,就不会有失败,或者至少我看到没有人做一些测试,而我会如果我离开
process.exit
电话,尝试不到 5 次就会看到错误。

这是我的工作:

const b = JSON.stringify(response.data);
const chunk = 200;
const len = b.length;
let pos;

for (pos = 0; pos <= len; pos += chunk) {
  process.stdout.write(b.substring(pos, pos + chunk));
}

console.log('B'); // This is just a test print out.

// process.exit(0);

在写入失败的情况下,最后一个“B”没有被打印出来,这让我认为这个过程甚至没有到达那一行就结束了,或者流没有机会写入它。我相信它是第二个,因为如果我将退出代码更改为其他内容,然后运行

echo $?
我会看到该退出代码。所以
process.exit
被评估。

我有一个可行的解决方案,即将

process.exit
注释掉,但我想知道这样做的正确方法是什么。我觉得我的解决方案不是最优的。

另外,因为我想明确地结束这个过程,所以我在测试打印输出行之后添加了接下来的几行:

process.stdout.on('finish', () => {process.exit(0)});
process.stdout.end();

备注:

  1. 我的代码在 axios 请求的承诺处理程序中运行。
  2. 我要写的测试字符串是 224364 个字符长。
node.js string stdout
© www.soinside.com 2019 - 2024. All rights reserved.