86

如果我在节点中编写以下程序:

  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 请求会导致它执行两次。

4

3 回答 3

181

这很正常 - 您的浏览器会拨打多个电话。

例如,大多数浏览器都会调用grab /favicon.ico

尝试记录网址:

console.log(req.url);

你会看到叫什么。

于 2012-08-14T22:48:57.310 回答
21

通常,favicon.ico由浏览器获取。所以,这两个电话。

此问题的解决方案可以是检查请求 URL 是否正在获取favicon.ico

http.createServer(function (req, res) {
    if (req.url != '/favicon.ico') {
        // do your stuffs
    }
}).listen(3500);
于 2018-07-24T07:36:16.090 回答
0

需要注意的另一件事是现代浏览器可能会预取或预加载页面。Chrome 有时甚至会在您在地址栏中输入之前执行此操作!

可以在Privacy and security下禁用它,但这会影响所有浏览。

在此处输入图像描述

您还可以检查标题Purpose: prefetch并返回错误。(我不确定官方的回应应该是什么。)

这种情况不太可能经常发生,但如果您正在测试一个 API,那么突然发出的意外请求充其量是令人讨厌的,更糟的是危险的。

于 2021-02-13T02:37:38.447 回答