2013-07-30 10 views
11

Uczę się Node.js i chciałbym zrozumieć "dlaczego", gdy kod wypluwa zduplikowane wyniki console.log, ale tylko pojedyncze odpowiedzi response.write.Node.js double console.log output

Herezje mój prosty przykład kodu:

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

A na mojej konsoli/terminalu uzyskać:

cześć 1

cześć 2

cześć 1

cześć 2

Dzięki.

Odpowiedz

19

Niektóre przeglądarki również wysłać żądanie, aby zlokalizować plik favicon.ico. Ponieważ plik nie jest domyślnie obecny, przeglądarka (w szczególności) zawsze będzie wysyłać dwie prośby: jedną dla pierwotnie żądanego pliku, a drugą dla favicon.ico. To jest wersja known bug w Chrome i została naprawiona w wersji 29. Firefox, jednak żąda favicon.ico tylko dla pierwszego żądania. Jeśli console.log URI żądania ścieżkę, trzeba zobaczyć wniosek do 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); 
+0

Dziwne. Czy istnieje sposób, aby to zmienić? Czy jest to kwestia "zasysania jaskiń"? – JDillon522

+0

Można 'response.end()', aby uniemożliwić wykonywanie obsługi żądania na żądanie do favicon '.if (request.url === '/favicon.ico') {response.end(); } 'Nie jestem pewien, czy istnieje jakakolwiek inna metoda. –

+1

@ JDillon522 są rozszerzenia chrome, aby go wyłączyć. – SheetJS

0

Jeśli wyjście nagłówek mówisz serwerowi, że znalazłeś favicon, stąd reakcja jest przetwarzany i bez względu na to co Cię zdobądź podwójną liczbę: console.log(). Zamiast skończyć go przed wysłaniem writeHead() lub wysłać 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(); 
} 
2

Ja miałem ten sam problem sam, a okazało się, że przy użyciu coś jak

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

wystarczy, aby uniknąć tego zachowania . Z jakiegoś powodu, kiedy sprawdzam plik req.url i porównuję go z '/favicon.ico' nic nie jest wysyłane do konsoli, w rzeczywistości wszystko w tym bloku jest ignorowane. Nie wiem, czy to zachowanie jest oczekiwane, ale na pewno możesz spróbować.

0

w pigułce powielanie jak to wspomniano wcześniej jest wynikiem wniosku favicon tak aby uniknąć tego problemu, proponuję Państwu ten prosty snipet:

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

Może być również wtyczki Chrome jak JSONView . Próbowałem to rozgryźć, dopóki nie spróbowałem incognito i zdałem sobie sprawę, że to już nie powoduje problemu. Żądał również pliku JSON.