在下面记录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服务器那样缓解这个问题?
我的问题不是为什么我知道为什么,我的问题是如何发现它是第二次并避免重复处理两次?
答案 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);