如果将文件可写流传递给Node.js中的Console构造函数,是否异步写入它?

时间:2017-07-19 22:49:54

标签: node.js asynchronous logging

我已阅读有关Console对象和A note on process I/O的文档,但无法确定以下内容是否会导致同步或异步操作:

const out = fs.createWriteStream('./out.log')
const logger = new Console(out)

logger.log('foo')

我很好奇这是如何起作用的,特别是在* Nix系统上。但我不希望这种行为在Windows上有所不同。我问的原因是因为我已经构建了一个利用Console对象的记录器,但是在生产过程中将日志写入文件时我不希望记录器被阻塞。

2 个答案:

答案 0 :(得分:4)

<强> tldr;
根据Node的官方文档,您在这里所做的是同步,因为您使用的是文件

  

写入可能是同步的,具体取决于流的内容   连接到系统是Windows还是Unix:

     
      
  • 文件:   在Windows和Linux上同步
  •   
  • TTY(终端):异步打开   Windows,在Unix上同步
  •   
  • 管道(和套接字):同步开启   Windows,在Unix上异步
  •   

警告:我强烈建议不要在生产服务上使用这些同步操作,因为同步写入会阻止事件循环,直到写入完成。在进行生产记录时,这可能是一个严重的缺点。

参考:Node.js Official Documentations / A note on process I/O

答案 1 :(得分:4)

异步

内部Console类维护一个回调_stdoutErrorHandler,在写操作完成后触发并检查错误。我们可以用它来测试异步性。

const fs = require('fs');
const { Console } = require('console');
const str = new Array(100).fill('').map(() => 'o'.repeat(1000 * 1000)).join('');
const out = fs.createWriteStream('./o.txt');
const logger = new Console(out);
logger._stdoutErrorHandler = () => { console.log('written');};
logger.log(str);
console.log('hey');

你会看到'嘿'在'书面'之前打印出来。

The note on process I/O适用于process.stdinprocess.stdout这些特殊流。当他们指向文件时,如下所示:

$ node someCode.js > file.txt

...在Unix中,Unix中的写操作将是同步的。这是在here行中处理的。在这种情况下,process.stdout流将连接到文件而不是通常的unix文件描述符fd1