16

我正在学习 Node.js,当代码吐出重复的 console.log 输出但只有一个 response.write 输出时,我想了解“为什么”。

这是我的简单代码示例:

var http = require('http');

http.createServer(function(request, response){
    response.writeHead(200, {'Content-type': 'text/plain'});
    console.log('hello 1');
    response.write('Hello world');
    console.log('hello 2');
    response.end();
}).listen(8000);

在我的控制台/终端上,我得到:

你好 1

你好 2

你好 1

你好 2

谢谢。

4

6 回答 6

25

一些浏览器还会发送请求以定位favicon.ico文件。由于默认情况下该文件不存在,因此浏览器(尤其是Chrome)将始终发送两个请求:一个用于最初请求的文件,另一个用于 favicon.ico。这是 Chrome 中的一个已知错误,已在版本 29 中修复。然而, Firefox仅在第一次请求时才请求 favicon.ico。如果你console.log请求 URI路径,你必须看到一个请求localhost:8000/favicon.ico.

var http = require('http');

http.createServer(function(request, response){
    response.writeHead(200, {'Content-type': 'text/plain'});
    if(request.url === '/favicon.ico') {
        console.log('Favicon was requested');
    }
    console.log('hello 1');
    response.write('Hello world');
    console.log('hello 2');
    response.end();
}).listen(8000);
于 2013-07-30T16:52:05.100 回答
2

我自己也遇到过同样的问题,我发现使用类似的东西

var http = require('http');
http.createServer(function(req,res) {
    if(req.url === '/favicon.ico')
    {
        //everything here is ignored
    }
    res.writeHead(200,{"Content-Type": "text/plain"});
res.write("Hello World\n");
res.end();
console.log("Connection made");
}).listen(1337, "127.0.0.1");
console.log("Server running at http://127.0.0.1:1337/");

足以避免这种行为。出于某种原因,当我检查 req.url 并将其与'/favicon.ico'没有发送到控制台进行比较时,实际上,该块中的所有内容都被忽略了。我不知道这种行为是否是预期的,但你肯定可以尝试一下。

于 2014-05-01T01:26:00.130 回答
1

If you output the header you're telling the server that you found favicon, hence the response is processed and no matter what you get that double console.log(). Instead, end it before sending a writeHead() or send a 404.

var http = require('http');

http.createServer(function (req, res) {
    if(req.url === '/favicon.ico') {
        res.writeHead(404);
        res.end();
    } else {
        res.writeHead(200, {'Content-Type': 'text/plain'});
    }
    //code here...

    res.end();
}
于 2013-10-23T10:48:13.347 回答
1

我认为这个问题在 chrome 版本 67.0.3396.87(32 位)中仍然存在,因为当我运行我的 nodeJS 脚本时,我看到了 2 个 console.log() 语句,一个能够打印出查询,另一个则不能,所以我更正了我的代码只能查看一次 console.log() 语句,这很简单,如果 request.url 的开头是 == (equal to)"/favicon.ico",我只需添加一个 return 语句代码和一切正常

以前的代码

var http = require('http');
var url = require('url');
http.createServer((request,response)=>{
var q = url.parse(request.url,true).query;
console.log(request.url);
console.log('hey there! we got a request from '+q.name+' !');
}).listen(8080);

输出是:

/?name=harshit
hey there we got a request from harshit !
/favicon.ico
hey there we got a request from undefined !

调试后的代码:

var http = require('http');
var url = require('url');
http.createServer((request,response)=>{
if(request.url == "/favicon.ico"){
return ;
}
var q = url.parse(request.url,true).query;
console.log(request.url);
console.log('hey there! we got a request from '+q.name+' !');
}).listen(8080);    

输出 :

/?name=harshit
hey there we got a request from : harshit !
于 2018-06-19T06:43:08.477 回答
0

它也可以是 Chrome 插件,例如JSONView. 我只是想弄清楚,直到我尝试隐身并意识到它不再导致问题。还请求一个 JSON 文件。

于 2017-08-29T17:43:21.417 回答
0

简而言之,前面提到的重复是 favicon 请求的结果,所以为了避免这个问题,我建议你这个简单的片段:

var pathname = url.parse(request.url).pathname;
if(pathname != '/favicon.ico')
console.log('hello 1');
于 2016-09-14T22:43:10.253 回答