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

Спасибо.


person JDillon522    schedule 30.07.2013    source источник


Ответы (6)


Некоторые браузеры также отправляют запрос на поиск файла 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);
person c.P.u1    schedule 30.07.2013
comment
Странный. Есть ли способ переопределить это? Или это вопрос сосать его лютик? - person JDillon522; 30.07.2013
comment
Вы можете response.end() предотвратить выполнение вашего обработчика запросов на запросы к фавиконам.if(request.url === '/favicon.ico') { response.end(); } Не уверен, что существует какой-либо другой способ. - person c.P.u1; 30.07.2013
comment
@ JDillon522 есть расширения для Chrome, чтобы отключить его. - person SheetJS; 30.07.2013

У меня была такая же проблема, и я узнал, что использую что-то вроде

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', ничего не отправляется на консоль, фактически все в этом блоке игнорируется. Я не знаю, ожидается ли такое поведение, но вы наверняка можете попробовать.

person Budgerous    schedule 01.05.2014
comment
Конечно, все, что это делает, это дополнительно выполняет блок, содержащий «все здесь игнорируется» по запросу favicon (и также делает все остальное)? Это не решит проблему OP, если вы не используете блок else для хранения оставшейся логики... - person Razzle; 29.03.2020
comment
Что ж, прошло 6 лет, поэтому я не уверен, почему я написал то, что написал, или над чем я тогда работал, но да, я думаю, что ваш комментарий имеет смысл. Думаю, запрос на фавикон или нет не должен влиять на описанное поведение. Ответ c.P.u1 кажется лучшей ставкой на исправление здесь - person Budgerous; 01.04.2020

Если вы выводите заголовок, вы сообщаете серверу, что нашли фавикон, поэтому ответ обрабатывается, и независимо от того, что вы получаете, это двойное 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();
}
person Emanuele    schedule 23.10.2013
comment
Я попробовал ваш ответ, и он кажется правильным в моей версии узла (v6.12.0), за исключением того, что мне пришлось передать аргумент ' ' методу конца. Это предотвращает двойной вывод console.log. - person jsalinasvela; 13.05.2018
comment
Большое спасибо! :). Я удалил res.end(); в if добавьте var url = require('url'); и измененный req.url == var path = url.parse(request.url).pathname;. Это сработало со мной. - person Blue Tram; 09.05.2019

я думаю, что эта проблема все еще сохраняется в версии Chrome 67.0.3396.87 (32-разрядная версия), потому что, когда я запустил свой скрипт nodeJS, я увидел 2 оператора console.log(), один из которых смог распечатать запрос, а другой нет, поэтому я исправил мой код, чтобы увидеть операторы console.log() только один раз, это было просто, все, что мне нужно было сделать, это добавить оператор возврата, если request.url был == (равно)"/favicon.ico" в начале код и все заработало

предыдущий код

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 !
person Karambit    schedule 19.06.2018
comment
отличный ответ бро! - person Karambit; 13.08.2020

в двух словах, дублирование, как упоминалось ранее, является результатом запроса favicon, поэтому, чтобы избежать этой проблемы, я предлагаю вам этот простой фрагмент:

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

Это также может быть плагин Chrome, например JSONView. Я просто пытался понять это, пока не попробовал инкогнито и не понял, что это больше не вызывает проблемы. Также запрашивал файл JSON.

person user2402877    schedule 29.08.2017