2011-09-11 51 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);