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
Спасибо.
Ответы
Ответ 1
Некоторые браузеры также отправляют запрос на поиск файла 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);
Ответ 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'
, ничего не отправляется в консоль, на самом деле все в этом блоке игнорируется. Я не знаю, ожидается ли это поведение, но вы наверняка сможете его попробовать.
Ответ 3
Если вы выведете заголовок, вы сообщаете серверу, что вы нашли favicon, следовательно, ответ обрабатывается и независимо от того, что вы получаете, это double 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();
}
Ответ 4
в двух словах дублирование, как упоминалось ранее, является результатом запроса favicon, поэтому, чтобы избежать этой проблемы, я предлагаю вам этот простой снайпер:
var pathname = url.parse(request.url).pathname;
if(pathname != '/favicon.ico')
console.log('hello 1');
Ответ 5
Он также может быть плагином Chrome, например JSONView
. Я просто пытался понять это, пока не попытался инкогнито, и понял, что это больше не вызывает проблемы. Также запрашивал файл JSON.