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

时间:2017-10-18 20:18:53

标签: 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是包含Buffer子进程的stdout。据我所知,将其转换为字符串的方法是使用.toString()方法,但在我的情况下,字符串是不完整的。我试图执行的命令应该产生~500 KB的数据,但是buffer.length是43741(即#43 KB)。

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

我正在使用最新的节点版本(8.7.0)。

有任何想法/建议吗?

编辑:在命令中附加| tr "\0" "\n"会将缓冲区大小增加到~122 KB,因此@YaroslavAdmin肯定会朝着正确的方向发展。结果仍然不完整。如何确保所有特殊字符都被转义?

1 个答案:

答案 0 :(得分:2)

在execSync之后添加.toString()

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