2016-01-26 32 views
0

每當我正在觀看的文件發生更改時,我都想打印一條消息。我能夠使用console.log來做到這一點,但我不知道如何使用response.write或類似的功能來做到這一點。Node.js正在看文件

var counter = 0; 
const 
    http = require('http'), 
    fs = require('fs'), 
    filename = process.argv[2]; 

var server = http.createServer(function(request, response) { 
    response.writeHead(200, { 'Content-Type' : 'text/plain' }); 
    counter = counter + 1; 
    response.end('Hello client ' + Math.round(counter/2)); 
}); 

server.on('listening', function() { 
    var watcher = fs.watch(filename, function(){ 
    console.log('The file ' + filename + ' has just changed.'); 
    }); 
}); 

server.listen(8080); 

另外,爲什麼我已經做了Math.round(counter/2)是因爲計數器由2每一個客戶端連接時增加的原因。我想知道爲什麼會發生這種情況,以及是否有更好的技術來解決這個問題。

回答

1

爲了能夠使用response.write來完成,它需要成爲您的服務器請求處理函數的一部分。

文件事件可以獨立於發送請求的人而發生,因此它的處理與處理請求的處理無關。因此,您沒有相關的要求寫入。

如果您想要跟蹤所有文件更改事件,並在用戶發送請求時將其顯示給用戶,請考慮將有關對象更改的信息存儲在處理函數外部的對象以及何時發生請求,讀取該對象以查看是否有更改,並基於它向用戶寫入響應。

+0

因此,如果用戶已經連接後,該文件已更改是不可能產生,而用戶一個新的響應gread模塊發送新的請求? – Barte

+0

由於您正在調用'response.end()',您要將所有數據一次發送給用戶。你可以考慮使用'response.write()'(https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback)來寫入數據塊,這樣可以保持連接並保持發送數據到相同的響應,但是看起來像一個奇怪的事情要做。 –

1

如果要通知最終用戶該文件已更改(例如在Web瀏覽器中),那麼您有多個選項,包括輪詢服務器或使用WebSockets。

我建議你看一看Server Sent Events

很容易實現,而且有NPM模塊,在那裏,使其即使在node.js中更容易例如npm sse

相關問題