Веб-сервер Nodejs вызывает запросListener дважды, когда страница загружается
Ниже приведен пример веб-сервера из документации с добавленным счетчиком. Он печатает счетчик на консоли, когда клиент/браузер запрашивает страницу.
Тем не менее, он вызывается дважды по запросу браузера. Почему?
Это то, что я ожидал бы:
browser : Hello World 1
console : Counter 1
[reload page]
browser : Hello World 2
console : Counter 2
но это происходит:
browser : Hello World 1
console : Counter 1
Counter 2
[reload page]
browser : Hello World 3
console : Counter 3
Counter 4
Я запускаю код с помощью командной строки
$ node example.js
Вот код:
var
http = require('http'),
counter = 0,
sys = require('util');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
counter++;
res.end('Hello World ' + counter + '\n');
sys.puts('Counter ' + counter);
}).listen(8000, "");
Ответы
Ответ 1
В программировании при застревании всегда полезно проследить код, чтобы лучше понять, что происходит. Самый простой способ сделать это - добавить дополнительные отладочные/печатные операторы, пока не увидите, что происходит.
Измените строку sys.puts на:
sys.puts('Counter ' + counter + " from " + req.url);
Я думаю, вы обнаружите, что второй запрос - это браузер, запрашивающий значок для сайта.
Ответ 2
Мы можем игнорировать подсчет обновления страницы из-за favicon со следующим фрагментом кода:
if (request.url === '/favicon.ico') {
response.writeHead(200, {'Content-Type': 'image/x-icon'} );
response.end();
console.log('favicon requested');
return;
}
Ссылка: https://gist.github.com/763822