增加 nodejs 管道的最大字节大小

Ben*_*ong 6 javascript stream maven node.js

我正在尝试编写一个小命令脚本来代理我项目中的其他脚本,并且我正在尝试使用 node 将标准输出从生成的进程通过管道传输到当前进程的标准输出:

function runCommand(command, arguments) {
    var commandProcess = childProcess.spawn(command, arguments);
    commandProcess.stdout.pipe(process.stdout);
    commandProcess.on("exit", process.exit);
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到我开始从我的子进程中获得大量输出(例如,其中一个是 maven 命令)。我看到的是它只打印出标准输出的前 8192 个字节,然后将其余的存储到下一个“数据”事件。然后它打印出下一个 8192 等等。这意味着输出有延迟,有时当我们运行服务器进程时,它有时会停止打印,直到您触发服务器上的某些内容触发另一个“数据”事件。

有没有办法增加这个缓冲区的大小或避免这种行为?理想情况下,这个指挥官脚本只是我们其他脚本的代理,并且应该完全按原样打印出所有内容。

小智 1

您正在使用异步的节点进程生成,因此当子进程提供标准输出时,它将提供输出。参考:[ https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options][1]

我建议使用子进程 exec 来运行您的进程,您可以在其中控制输出缓冲区的大小,这将在子进程完成后提供输出。这就是传递缓冲区大小的方式

var execute = function(command, callback){
    exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); });
};
Run Code Online (Sandbox Code Playgroud)

  • 实际上我们不能使用“exec”,因为这是一个服务器命令(即一个进程,除非您手动告诉它退出,否则不会退出),我们实际上希望它是异步的。在我看来,“生成”进程的硬编码限制为 8192 字节,我需要一种解决方法。 (3认同)