【问题标题】:NodeJS parse process.stdout to a variableNodeJS 将 process.stdout 解析为一个变量
【发布时间】:2014-12-27 19:06:28
【问题描述】:

我正在尝试从标准输出中读取并将其放入 NodeJS 中的变量中。这是我尝试过的:

process.stdout.on('data', function(data) {
    console.log(data.toString())
});

console.log('hello')

我希望它输出 hello 两次,但它只输出一次。为什么没有触发回调?它在使用标准输入时有效..

【问题讨论】:

  • 您为什么要阅读自己输出的文本?您是否正在尝试读取其他程序的标准输出?

标签: node.js stream


【解决方案1】:

您正在尝试在a Writable Stream 上使用the Readable Stream API。具体来说,the process.stdout stream is for writing to stdout not reading from stdout。你试图做的事情是不可能的,如果它确实有效,会创建一个无限循环,breaks the definition of what stdin and stdout are

【讨论】:

  • +1。这是线程中问题本身对问题的最合乎逻辑的描述。
【解决方案2】:

你做不到。阅读@mattr's answer

相反,您可以连接到process.stdout.write将所有文本打印到process.stdout。我在我的 Node.js 服务器上使用下面的代码。

global.serverLog = "";
process.stdout.write = (function(write) {
        return function(string, encoding, fileDescriptor) {
                global.serverLog += string;
                write.apply(process.stdout, arguments);
            };
    })(process.stdout.write);

请注意,您也可以对 process.stderr 执行相同的操作。

【讨论】:

    【解决方案3】:

    上面的一个不太容易混淆的版本是:

    process.stdout._orig_write = process.stdout.write;
    process.stdout.write = (data) => {
      mylogger.write(data);
      process.stdout._orig_write(data);
    }
    

    【讨论】:

    • 谢谢!如果有人遇到Max call stack 错误,很可能是因为变量被赋值了两次。因此,您需要添加条件检查以确保 _orig_write 属性不存在:if (!process.stdout._orig_write) process.stdout._orig_write = process.stdout.write;
    【解决方案4】:

    我建议如下:

    1. 将标准输出从进程传送到双工流,您可以在其中创建读取流
    2. 你解析数据,然后你可以关闭它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2021-12-14
      • 2018-09-18
      • 2015-03-19
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多