node.js - 如果将文件可写流传递给 Node.js 中的控制台构造函数,是异步写入吗?

标签 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 对象的记录器,但我不希望记录器在生产中将日志写入文件时被阻塞。

最佳答案

它将是异步

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

关于node.js - 如果将文件可写流传递给 Node.js 中的控制台构造函数,是异步写入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45202306/

相关文章:

java - 带有干扰器的 log4j2 配置

eclipse - 我怎样才能告诉 tomcat(在 eclipse 中)使日志文件成为滚动日志文件?

javascript - 如果未找到带有选择器的元素,Puppeteer page.$eval 会抛出错误

javascript - 在 Express 中 res.render() 和 res.redirect() 的正确用法是什么?

node.js - Node 和 elasticSearch 客户端 - 客户端注意到服务器不是 Elasticsearch 支持的发行版

javascript - 快速发送时未​​收到异步 AJAX 请求

javascript - javascript for 循环内的异步过程

javascript - 在稀疏 Javascript 数组上执行查找

javascript - 理解异步和等待

java - 文件读/写与数据库读/写