nodejs - http.createServer, кажется, вызывает дважды
Если я напишу следующую программу в узле:
http.createServer(function (req, res) {
if( req.method == 'GET' ) {
var body = ''; req.on('data', function(data) { body += data });
req.on('end', function() {
console.log('request ended')
});
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('142\n');
}).listen(3500);
А затем нажмите на сервер с http://xxx.xx.xxx.xx:35010
я вижу request ended
дважды на моей консоли - я не уверен, почему один HTTP-запрос вызывает его выполнение дважды.
3 ответа
Это нормально - ваш браузер делает более одного звонка.
Большинство браузеров звонят, чтобы захватить /favicon.ico
например.
Попробуйте войти в URL:
console.log(req.url);
и вы увидите, что называется.
В общем-то, favicon.ico
выбирается браузерами. Итак, два звонка.
Решением этой проблемы может быть проверка URL запроса, если он выбирает favicon.ico
или нет.
http.createServer(function (req, res) {
if (req.url != '/favicon.ico') {
// do your stuffs
}
}).listen(3500);
Еще одна вещь, на которую следует обратить внимание, это то, что современные браузеры могут выполнять предварительную выборку или предварительную загрузку страниц. Chrome иногда делает это даже до того, как вы нажмете Enter в адресной строке!
Его можно отключить в разделе «Конфиденциальность и безопасность », но это повлияет на все просмотры.
Вы также можете проверить заголовок
Purpose: prefetch
и просто вернуть ошибку. (Я не уверен, каким должен быть официальный ответ в производстве.)
Это вряд ли будет происходить часто, но если вы тестируете API, это может быть в лучшем случае раздражающим, а в худшем — опасным из-за внезапного выполнения неожиданного запроса.