annoyance node.js为一个页面刷新调用两次httpserver回调函数

时间:2013-08-25 11:37:01

标签: javascript node.js http

在下面记录OnRequest函数时(在此tut http://www.nodebeginner.org/中找到)

var http = require("http");

function onRequest(request, response) {
  console.log("Request received.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server has started.");

日志将打印“收到请求”。每次刷新网页一次两次:这很烦人,因为这意味着我可以在进行其他处理时产生副作用。

为什么node.js不像其他http服务器那样缓解这个问题?

我的问题不是为什么我知道为什么,我的问题是如何发现它是第二次并避免重复处理两次?

2 个答案:

答案 0 :(得分:1)

要忽略favicon请求,只需读取请求对象的URL属性,然后处理请求。如果您愿意,也可以发送404 Not Found

http.createServer(function (req, res) { 
  if (req.url === '/favicon.ico') {
    res.writeHead(200, {'Content-Type': 'image/x-icon'});
    res.end();
    return;
  }

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, world!');
}).listen(80);

此外,您关于其他Web服务器如何处理favicon请求的声明不正确。例如在Nginx中,请求的处理方式与任何其他请求一样,这通常会导致HTTP日志中出现许多“文件未找到”错误。

答案 1 :(得分:0)

可能还有一项针对favicon.ico的额外请求。

编辑:

例如,在这种情况下的解决方案是忽略对某些路径的请求。

例如:

yourdomain.com/favicaon.ico

没有(404)回应,而

yourdomain.com/some/infinitely/more/important/path

通过计算成本更高的响应得到承认。但如果有人确实要求两次这个网址,你需要两次确认。你有没有让谷歌莫名其妙地没有加载? HTTP不完美,网络数据丢失。如果他们在你刷新后决定不回应怎么办?没有更多的Google给你了!

例如你可以做这样的事情

http.createServer(function (req, res) { 
    if (req.url.matches(/some\/important\/path/i') { 
        res.writeHead(200);//May need to add content-type, may not.
        res.write(someFunctionThatReturnsData());
        res.end();
    } else {//For favicon and other requests just write 404s
        res.writeHead(404);
        res.write('This URL does nothing interesting');
        res.end();
    }
}).listen(80);