node.js - NodeJS子进程标准输出没有完全返回
问题描述
我正在使用节点运行以下代码,当文件超过 12ko 左右时,我总是只得到大约 80% 的 stdout 应该返回的内容。如果文件是 240ko,它仍然会输出 80%。如果它低于 12 它将完全输出。
当我打开 cmd 并手动运行命令时,我总是得到完整的输出。
我尝试了 exec、execFile,我尝试增加最大缓冲区或更改编码,但这不是问题。我试图添加选项{shell: true, detached: true}
,但它是徒劳的,事实上,当我以分离的方式运行它时,它似乎运行得很好,因为它确实打开了一个实际的控制台,但是当进程完成时我无法检索标准输出。
const spawn = require('child_process').spawn;
const process = spawn(
'C:\\Users\\jeanphilipped\\Desktop\\unrtf\\test\\unrtf.exe',
['--html' ,'C:\\Users\\jeanphilipped\\Desktop\\unrtf\\test\\tempaf45.rtf'],
);
let chunks = [];
process.stdout.on('data', function (msg) {
chunks = [...chunks, ...msg];
});
process.on('exit', function (msg) {
const buffer = Buffer.from(chunks);
console.log(buffer.toString());
});
有什么线索吗?它似乎是 Node,因为当我手动运行它时,一切正常。
解决方案
根据 nodejs 文档,所有 child_process 命令都是异步的。因此,当您尝试访问您的块变量时,不能保证您的命令已经完成,也许您的命令仍在处理中。因此建议您将整个 child_process 命令包装在 async/await 函数中。
推荐阅读
- php - 如何计算答案 a,b,c,d,e,f 被给出的次数?
- java - 如何使用第二个 ComputableFuture 对象设置 CompletableFuture 对象的字段值
- javascript - 从外部获取函数参数而不在 javascript 中执行此函数
- azure - Azure 添加您没有权限的应用注册
- scala - 如何使用 Either 产生所有错误(失败)
- javascript - 在 React 中处理多个输入
- c# - 为什么 Datetime.DayOfWeek 是错误的?
- angular - 选择器 NGRX 内的调度操作
- ruby - 当我运行 ruby 代码时,如何从带有表情符号的 document.txt 行中读取并在终端上显示它们?
- vue.js - Nuxt.js + BootstrapVue:如何将表单卡片放在页面中心?