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, это может быть в лучшем случае раздражающим, а в худшем — опасным из-за внезапного выполнения неожиданного запроса.

Другие вопросы по тегам