如何将执行转换为生成?



我使用exec和以下代码来执行带有 NPM 的脚本,它运行良好。

const { exec, spawn } = require('promisify-child-process')
await exec(`npm run start ${key}  ${scriptVariables[key]}`)

然后我开始收到此错误:

范围错误 [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: 标准输出最大缓冲区长度超出

所以我假设缓冲区是一个问题,并将其更改为:

await exec(`npm run start ${key}-Product  ${UrlsArray[i]}`, {maxBuffer: 4096 * 4096})

哪个更好,但仍然偶尔出现一些错误。 所以从我读到的内容来看,我需要改成spawn,并且打击不缓冲。

但是这个不起作用:

await spawn(`npm run start ${key}-Product ${UrlsArray[i]}`)

知道如何转换为代码吗?

对于spawn,您需要以数组形式提供参数:

await spawn(
'npm',
['run', 'start', `${key}-Product`, UrlsArray[i]],
{maxBuffer: 4096 * 4096}
);

但是,如果它与最大缓冲区长度有关,这不会解决您的错误, 您仍然需要增加限制。 如果您的用例允许,您还可以使用流式传输而不是阅读 整个输出在前面。您也可以尝试从中删除一些输出 npm 脚本。

下面是 Node.js 文档中使用流式处理的示例:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});

最新更新