使用 Streams 從 TextFile 讀取資料

節點中的 I / O 是非同步的,因此與磁碟和網路互動涉及將回撥傳遞給函式。你可能想要編寫從磁碟提供檔案的程式碼,如下所示:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8000);

這段程式碼很有用,但它很笨重,並在將結果寫回客戶端之前將整個 data.txt 檔案快取到每個請求的記憶體中。如果 data.txt 非常大,那麼你的程式可能會開始佔用大量記憶體,因為它會同時為很多使用者提供服務,特別是對於連線速度較慢的使用者。

使用者體驗也很差,因為使用者需要等待整個檔案緩衝到伺服器上的記憶體中才能開始接收任何內容。

幸運的是,兩個(req, res)引數都是流,這意味著我們可以使用 fs.createReadStream() 而不是 fs.readFile() 以更好的方式編寫它:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

這裡 .pipe() 負責從 fs.createReadStream() 中監聽’data’和’end’事件。這段程式碼不僅更乾淨,而且現在 data.txt 檔案將立即從磁碟接收到一個塊一次寫入客戶端。