是否可以通过管道传输到 console.log?

Posted

技术标签:

【中文标题】是否可以通过管道传输到 console.log?【英文标题】:Is it possible to pipe to console.log? 【发布时间】:2014-08-17 02:49:46 【问题描述】:

我正在尝试学习 node.js。

我正在尝试理解流和管道。

是否可以将http请求的响应通过管道传输到console.log?

我知道如何通过将处理程序绑定到数据事件来做到这一点,但我更感兴趣的是流式传输到控制台。

http.get(url, function(response) 
  response.pipe(console.log);
  response.on('end', function() 
    console.log('finished');
  );
);

【问题讨论】:

【参考方案1】:

console.log 只是一个将流程流通过管道传输到输出的函数。

注意以下是示例代码

console.log = function(d) 
  process.stdout.write(d + '\n');
;

到process.stdout 的管道完全相同。

http.get(url, function(response) 
  response.pipe(process.stdout);
  response.on('end', function() 
    console.log('finished');
  );
);

注意你也可以这样做

process.stdout.write(response);

【讨论】:

FWIW,process.stdout 是一个可写流,因此不会发出 'end' 此外,由于其特殊状态,它也不会发出 'finish'。 这对我不起作用UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Invalid data, chunk must be a string or buffer, not object @Tyguy7 什么?首先,这是从你没有捕捉到的承诺中抛出的,然后阅读错误消息。您传递的是一个对象,而不是流或缓冲区。 我现在意识到我试图通过管道传输到标准输出的响应对象实际上是使用 request.js 的响应对象,而不是 http。 我得到了 Tyguy 得到的相同(内部)错误,也提到了 in this GH issue,如果我将 pipe 发送到标准输出,它会抛出,但如果我 .on("data", console.log) 它完全按预期工作。所以,这是这个答案不正确的一种情况,我认为是因为 console.log 对非字符串输入做了一些额外的处理。

以上是关于是否可以通过管道传输到 console.log?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Mac 上将 Xamarin 输出通过管道传输到 less 中?

是否可以将所有浏览器控制台消息/错误通过管道传输到远程机器?

如何检测 Node 的 process.stdout 是不是正在通过管道传输?

“|”是啥意思(单管道)在 JavaScript 中做啥?

node.js - 将图像缓存到文件系统并将图像通过管道传输到响应

在 Jasmine 测试中将对 console.log() 的调用重定向到标准输出