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.