Node.js ReadStream从不调用'data'侦听器

Node.js ReadStream never calls 'data' listener

本文关键字:data 侦听器 调用 js ReadStream Node      更新时间:2023-09-26

我有一个名为a.t txt的文件,我可以使用fs.readFile打开和读取。然而,我似乎无法读取它与createReadStream:

var fs = require('fs');
var stream = fs.createReadStream('a.txt');
stream.on('data', function() { console.log('data present'); });

这从来没有打印任何东西,我错过了什么?

如果这种情况发生在我身上。当您在REPL中运行这段代码时,控制流将返回到您键入的每一行之间的节点事件循环。当这种情况发生时,节点会抓住机会执行任何挂起的IO。但是因为你没有附加一个监听器,"数据"事件就会愉快地被遗忘。

可以通过将上面的代码粘贴到javascript文件中并将其作为脚本运行来验证这一点。它工作得很好,因为在控制返回到事件循环之前附加了侦听器。

我们遇到的这个问题的版本是当打开一个流并试图在回调中使用它时。在封闭函数中打开流并从回调中引用它不起作用-节点在事件侦听器附加之前已经泵出了所有数据。

有两种方法可以解决这个问题:要么在打开流时立即调用pause,要么确保在执行任何回调之前附加侦听器。

尝试:

var data = '';
var rs = fs.createReadStream('/path/to/file');
rs.on('data', function(data) {
  data += data;
});
rs.on('end', function() {
  console.log(data);
});

为确保无误,请尝试正确获取文件的路径。

var path = __dirname + '/a.txt';
console.log(path);
var stream = fs.createReadStream(path);