2013-07-30 26 views
11

Sto imparando Node.js e mi piacerebbe capire il "perché" quando il codice sputa uscite console.log duplicate ma solo un singolo output response.write.Node.js doppia console.log output

Heres mia semplice esempio di codice:

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

E sulla mia console/terminale ottengo:

ciao 1

ciao 2

ciao 1

ciao 2

Grazie.

risposta

19

Alcuni browser inviano inoltre una richiesta per individuare il file favicon.ico. Poiché il file non è presente per impostazione predefinita, un browser (Chrome in particolare) invierà sempre due richieste: una per il file richiesto in origine e un'altra per favicon.ico. Questo è un known bug in Chrome ed è stato risolto nella versione 29. Firefox, tuttavia, richieste per favicon.ico solo per la prima richiesta. Se si console.log l'URI della richiesta percorso, si deve vedere una richiesta di 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

Strano. C'è un modo per scavalcarlo? O è una questione di "succhiare il ranuncolo"? – JDillon522

+0

È possibile 'response.end()' per impedire l'esecuzione del gestore richieste su richieste a favicon. If (request.url === '/favicon.ico') {response.end(); } 'Non sono sicuro se esiste un altro modo. –

+1

@ JDillon522 ci sono estensioni chrome per disabilitarlo. – SheetJS

0

Se gli header che stai dicendo il server che hai trovato favicon, quindi la risposta viene elaborata e non importa quello che ottenere quel doppio console.log(). Invece, terminarla prima di inviare un writeHead() oppure invia una 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

Ho avuto lo stesso problema me stesso, e ho scoperto che usando qualcosa come

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

è sufficiente per evitare che il comportamento . Per qualche ragione, quando controllo req.url e lo confronta con '/favicon.ico' nulla viene inviato alla console, infatti, tutto in quel blocco viene ignorato. Non so se questo comportamento è previsto, ma puoi sicuramente provarlo.

0

in poche parole la duplicazione, come si è detto prima che è il risultato della richiesta favicon in modo da evitare questo problema, vi propongo questo semplice snipet:

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

Può anche essere un plugin Chrome come JSONView . Stavo solo cercando di capirlo fino a quando ho provato l'incognito e ho capito che non causava più il problema. Inoltre stava richiedendo un file JSON.