2011-09-11 34 views
2

我有一个名为a.txt的文件,我可以使用fs.readFile打开并读取该文件。然而,我似乎无法读取它与createReadStream:Node.js ReadStream从不调用'data'listener

var fs = require('fs'); 

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

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

+0

你在'a.txt'中有任何内容吗? –

+0

是的,这只是一个例子,实际上我正在加载mp3文件。 – Diego

+0

但是,如果该示例正在处理此代码,那么问题就出在别的地方。 –

回答

1

有这种确切的情况发生在我身上。在REPL中运行此代码时发生的情况是,控制流将返回到您键入的每一行之间的节点事件循环。发生这种情况时,节点正在借此机会做任何未决的IO。但是因为你没有附加一个听众,所以'数据'事件快速地被遗忘。

您可以通过将上述代码粘贴到JavaScript文件并将其作为脚本运行来验证。它工作正常,因为在控制返回到事件循环之前,侦听器已连接。

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

您可以通过以下两种方法解决这种情况:打开电话后立即在电话上呼叫暂停,或者确保在通过任何回叫电话之前附加听众。

0

尝试:

var data = ''; 

var rs = fs.createReadStream('/path/to/file'); 

rs.on('data', function(data) { 
    data += data; 
}); 

rs.on('end', function() { 
    console.log(data); 
}); 
0

只是可以肯定,尝试正确获取文件的路径。

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