2016-01-26 2 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

Таким образом, если пользователь подключен и после того, что файл был изменен это не представляется возможным, чтобы создать новый ответ без пользователя отправив новый запрос? – Barte

+0

Поскольку вы вызываете 'response.end()', вы сразу отправляете все данные пользователю. Вы можете использовать 'response.write()' (https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback), чтобы записать куски данных, которые сохраняли бы это соединение и продолжали отправлять данные в один и тот же ответ, но это кажется странным. –

1

Если вы хотите сообщить конечному пользователю, что файл имеет изменения, например, в веб-браузере, у вас есть несколько параметров, включая опрос сервера или использование веб-узлов.

Я бы порекомендовал вам взглянуть на Server Sent Events

Это легко осуществить, и есть НПЙ модуль там, чтобы сделать его еще проще в Node.js. например npm sse

Смежные вопросы