如何让child_process返回带换行符的标准输出?
解决child_process返回带换行符输出的问题
原代码的核心问题
stdout.on('data')事件会分多次触发(输出内容较大时会拆分成多个数据块),你在第一次触发时就调用resolve,导致只返回了第一块输出,后续内容全部丢失。- 直接给
data追加\n可能破坏原输出的换行结构,原命令输出本身就带有换行符,只是没被完整收集。 - 拼写错误:
rejects应为reject。
正确实现方式
需要先收集所有输出内容,等到进程完全退出后再返回结果,这样才能保留完整的换行格式:
return new Promise<string>((resolve, reject) => { const bat = exec(getBluetoothDevices); let fullOutput = ''; if (bat.stdout) { bat.stdout.on('data', (data: string) => { // 累加所有输出,保留原有的换行符 fullOutput += data; }); } let errorMsg = ''; if (bat.stderr) { bat.stderr.on('data', (data: string) => { // 收集完整的错误输出 errorMsg += data; }); } // 进程退出时统一返回结果 bat.on('exit', (code: number) => { if (code === 0) { resolve(fullOutput); } else { reject(new Error(`进程退出码:${code}\n错误信息:${errorMsg}`)); } }); // 捕获进程执行时的异常 bat.on('error', (err) => { reject(err); }); });
说明
- 原命令的输出本身就包含换行符,只要完整收集所有
data块并累加,就能保留原本的换行格式。 - 进程退出时再处理结果,确保不会遗漏任何输出内容。
内容的提问来源于stack exchange,提问作者pcace
相关产品推荐
相关产品推荐

