node.js - child_process.execSync 返回的缓冲区不完整

标签 node.js child-process

我有以下执行 shell 命令的脚本:

#!/usr/bin/env node

const { execSync } = require('child_process');

try {
    const data = execSync(
        'yarn licenses generate-disclaimer --prod',
        { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
    );

    console.log(data.length);

    return true;
} catch (error) {
    console.error(`Failed to generate disclaimer: ${error.message}`);
    return false;
}

data 是一个包含子进程的 stdoutBuffer。据我了解,将其转换为字符串的方法是使用 .toString() 方法,但在我的例子中,字符串是不完整的。我尝试执行的命令应该会产生约 500 KB 的数据,但 buffer.length 是 43741(即约 43 KB)。

问题可能是 yarn licenses 输出包含一些特殊字符,导致缓冲区不完整。如果我用 printf "%0.s-"{1..500000} 替换命令,缓冲区就完成了。

我使用的是最新的 Node 版本 (8.7.0)。

有什么想法/建议吗?


编辑:附加 | tr "\0""\n" 命令将缓冲区大小增加到 ~122 KB,所以@YaroslavAdmin 肯定是在寻找正确的方向。结果仍然不完整。如何确保转义所有特殊字符?

最佳答案

在 execSync 之后添加 .toString()

const data = execSync(
    'yarn licenses generate-disclaimer --prod',
    { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
).toString(); // <<<<<<<<<<<<

关于node.js - child_process.execSync 返回的缓冲区不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46818563/

相关文章:

javascript - 在找到对象数组(使用 findOne())之后和保存之前如何增加对象数组中的字段?

node.js - 如何在 node-oidc-provider 中重定向失败的登录尝试

node.js - 如何有效关闭MongoDB的changeStream?

javascript - Node.js虚拟内存在使用子进程时不断增加

c - 写入子进程文件描述符

javascript - nodejs子进程: write stdout in realtime & run sequentially

node.js - HTTP POST Google Cloud Functions NodeJS

node.js - npm update -package- 不更新包

node.js - 在AWS Lambda中使用JavaScript eval()

windows - 使用子进程 NodeJS 运行 exe 文件