You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:52