Node.js 如何解析execa或child_process子进程多段stdout输出
问题核心原因
你当前拿到的stdout本质是子进程所有标准输出拼接后的纯文本字符串。按照你现有子进程的写法,两次console.log打印数组的内容会被换行符拼接成如下形式:
[ 'a1', 'a2', 'a3', 'a4', 'a5', 'a6' ] [ 'a3', 'a4', 'a5', 'a6' ]
这段文本既不符合标准JSON格式要求,也没有固定的结构边界,无法直接从中解析出原始的两个数组值。
可直接落地的解析方案
方案1:统一结构化输出,父进程直接解析
调整子进程的输出逻辑,把需要返回的所有内容封装为统一结构后序列化为标准JSON,避免直接打印数组本身:
- 修改子进程
testExecaArray.js的逻辑:let argv = process.argv.slice(2) if (argv.length >= 1) { let arr = JSON.parse(argv[0]) // 把所有需要返回的内容装入结构化对象,统一序列化为JSON const returnData = { originalArr: arr, slicedArr: arr.slice(2) } console.log(JSON.stringify(returnData)) } - 父进程拿到
stdout后直接做JSON解析,即可取出对应的数组值:public static async testExecaArray() { const arr = ["a1", "a2", "a3", "a4", "a5", "a6"] const { stdout } = await execa("node", ["/testExecaArray.js", JSON.stringify(arr)]) // 直接解析整段stdout为结构化对象 const { originalArr, slicedArr } = JSON.parse(stdout) console.log(originalArr, slicedArr) }
注意:这种实现方式要保证子进程中所有
console.log输出的内容都是需要返回的业务数据,不要额外打印调试日志,否则会污染JSON字符串,导致父进程解析失败。
方案2:借助execa内置的序列化能力
execa原生支持自动结构化传输,不需要手动拼接和解析JSON:
- 调用execa时增加序列化配置项:
const { stdout } = await execa( "node", ["/testExecaArray.js", JSON.stringify(arr)], { serialization: 'json' } ) - 子进程中不需要手动序列化,直接通过
process.send()传递需要返回的对象即可,execa会自动完成序列化和解析流程。
常见踩坑提醒
- 不要依赖Node.js直接打印数组的输出格式:
console.log打印数组时输出的是带单引号、缩进的调试格式,不是标准JSON(比如使用单引号而非JSON要求的双引号),直接解析一定会报错。 - 如果需要同时输出调试日志和业务返回值,可以给业务返回值加固定的前缀标记,父进程过滤出带标记的输出行再做解析,避免把普通日志混入返回值。
内容的提问来源于stack exchange,提问作者Jack Smith
相关产品推荐
相关产品推荐

