我正在学习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
感谢。
答案 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);