Node.js是double console.log输出

时间:2013-07-30 16:25:53

标签: node.js console.log

我正在学习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

感谢。

6 个答案:

答案 0 :(得分:23)

某些浏览器还会发送查找 favicon.ico 文件的请求。由于默认情况下该文件不存在,因此浏览器(特别是 Chrome )将始终发送两个请求:一个用于最初请求的文件,另一个用于favicon.ico。这是Chrome中的known bug,已修复版本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);

答案 1 :(得分: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'进行比较时,没有任何内容发送到控制台,实际上,该块中的所有内容都将被忽略。我不知道这种行为是否是预期的,但你确定可以尝试一下。

答案 2 :(得分:1)

如果您输出标题,则告诉服务器您找到了favicon,因此无论您获得双重console.log(),都会处理响应。相反,在发送writeHead()或发送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();
}

答案 3 :(得分:0)

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

var pathname = url.parse(request.url).pathname;
if(pathname != '/favicon.ico')
console.log('hello 1');

答案 4 :(得分:0)

它也可以是像JSONView这样的Chrome插件。我只是想弄清楚,直到我尝试隐身,并意识到它不再导致问题。还在请求JSON文件。

答案 5 :(得分:0)

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

以前的代码

(defun eval-after-sym-loaded (sym fun)
  "funcall the 0-argument function `fun' only after `sym' has been bound after a `load-file'
if `sym' is already bound, call `fun' immediately"
  (if (boundp sym)
      (funcall fun)
    (push (cons sym fun) eval-after-sym-loaded-alist)))

(defvar eval-after-sym-loaded-alist nil
  "alist used internally by eval-after-sym-loaded")

(defun eval-after-sym-loaded-hook (file-loaded)
  (setf eval-after-sym-loaded-alist
    (loop for (sym . fun) in eval-after-sym-loaded-alist
          if (boundp sym) do
              (funcall fun)
          else collect (cons sym fun))))

(add-hook 'after-load-functions 'eval-after-sym-loaded-hook)

;; example usage:

(eval-after-sym-loaded 'html-mode-map
                       (lambda () (message "the symbol 'html-mode-map has been loaded!")))

(eval-after-sym-loaded 'js-mode-map
                       (lambda () (message "the symbol 'js-mode-map has been loaded!")))

,输出结果为:

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);