更新:
即使为favicon.ico
发送了另一个请求并且函数再次执行(两个console.log(数据)输出),为什么响应对象不会被发送两次?
另外,有没有办法不发送对favcion.ico的请求,因为我不希望我的函数无用地运行两次?
我创建了一个非常简单的servlet来接受GET(默认)并在读取文件后将内容返回给浏览器
var http = require("http");
var fs = require("fs");
var num=0;
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
var data = '';
// Create a readable stream
var readerStream = fs.createReadStream('input.txt');
// Set the encoding to be utf8.
readerStream.setEncoding('UTF8');
// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
data += chunk;
});
readerStream.on('end',function(){
console.log(data); //To print same file content in the console
response.end(data);
});
readerStream.on('error', function(err){
console.log(err.stack);
data+="\n\n"+err.stack;
});
}).listen(8081);
// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');
但是每次我运行这个servlet并在http://localhost:/8081发出请求时,我在控制台上打印文件的内容两次但在浏览器窗口只打印一次(这是预期的行为)。
控制台行为的原因是什么?
此外,我通过添加一个计数器来修改程序,以计算每个请求运行函数的次数(为data+num
和console
附加值为response
)和它被发现是两个但是第一次执行该函数的响应是浏览器收到的响应,而不是第二次执行(浏览器窗口打印数据+ 1 第一次请求)。
答案 0 :(得分:1)
大多数浏览器都会调用抓取/favicon.ico。
尝试记录网址,您可以看到被调用的内容。
console.log(req.url);
答案 1 :(得分:0)
正如@sForSujit指出的那样,显然有两个请求针对浏览器想要的每个页面作为响应 - 另一个是名为favicon.ico
的文件,它是页面标题旁边的图标文件显示在浏览器选项卡上。
这导致两个请求也被服务器捕获,这再次使文件读取操作并在第二次在控制台上打印出来。响应对象也使第二次在客户端变得无用,因为它正在寻找您的favicon.ico文件作为响应对象。
如何获取?
浏览器首先请求" favicon.ico"尝试获取该图标。从您的网页目录。如果找不到这样的文件,它会尝试从你网站的根目录中获取它,如果失败了,它只会使用默认图标。
Chrome会在根目录中搜索favicon.ico文件。
Firefox在每个页面都需要这个:
<link rel="icon" type="image/png" href="/favicon.png" />
大多数(如果不是全部)现代浏览器也可以使用favicon.ico文件。事实上,他们中的许多人也接受其他图形格式的文件,例如PNG格式。
但是,需要再次为您的网站的每个网页设置您希望显示自定义图标的位置。要了解如何处理,请阅读SO回答here
如何避免favico.ico请求?
来自vog's回答,
以下解决方案非常简短,有效的HTML5,并且不会引起IE 8及更早版本的任何怪癖。
只需将以下行添加到HTML文件的部分:
<link rel="icon" href="data:,">
答案 2 :(得分:0)
我找到了这个有效的URL链接来摆脱网站图标错误。
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
希望您发现它有用。