2017-07-19 173 views
1

我想創建一個簡單的Node.js服務器並使用pipe()方法發送數據。但我有一個問題。刷新Node.js頁面時不加載

第一次啓動服務器時會加載頁面,但當我刷新頁面時,頁面會變爲空白。我的意思是數據沒有加載。爲什麼會發生?

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

var myReadStream = fs.createReadStream(__dirname + '/input.txt', 'utf8'); 


http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    myReadStream.pipe(res); 
}).listen(3300); 

回答

2

,如果你將它更改爲這會工作:

http.createServer(function (req, res) { 
    var myReadStream = fs.createReadStream(__dirname + '/input.txt', 'utf8'); 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    myReadStream.pipe(res); 
}).listen(3300); 

這是因爲一旦讀取流不會自動復卷(事實上它不能)。

但它不是服務靜態內容的最靈活的方式。

請參閱此答案,瞭解使用和不使用Express的靜態文件的五個示例,從使用高級框架到非常低級的手動重新創建輪子類型的實現。

+0

跌宕!我認爲服務器每次都可以訪問myReadStream變量,因爲它是全局的。其實我並沒有試圖提供靜態內容。我只是試圖使用管道,並瞭解它的工作方式。 –

+1

@MertŞafak是的,它可以到達變量,它是全局的,但是一旦流被讀取,所有後續請求都會看到相同的完成流。 – rsp

+0

@MertŞafak對流的引用仍然可用,但流本身[將已經結束](https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options),就像它在管道末尾所做的一樣( )' – George