2013-07-30 37 views
11

Ich lerne Node.js und ich möchte das "warum" verstehen, wenn Code doppelte console.log Ausgaben spuckt, aber nur eine einzige Antwort.Write-Ausgaben.Node.js doppelte console.log Ausgabe

Heres mein einfaches Codebeispiel:

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

Und auf meiner Konsole/Terminal I erhalten:

hallo 1

hallo 2

hallo 1

Hallo 2

Danke.

Antwort

19

Einige Browser senden ebenfalls eine Anfrage, um die Datei favicon.ico zu finden. Da die Datei standardmäßig nicht vorhanden ist, sendet ein Browser (insbesondere Chrome) immer zwei Anfragen: eine für die ursprünglich angeforderte Datei und eine weitere für favicon.ico. Dies ist ein known bug in Chrome und wurde in der Version 29 behoben. Firefox, jedoch Anfragen für favicon.ico nur für die erste Anfrage. Wenn Sie die Anforderung URI Pfadconsole.log, müssen Sie eine Anfrage an 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

Seltsam. Gibt es eine Möglichkeit, das zu überschreiben? Oder ist es eine Frage von "saugen es Butterblume"? – JDillon522

+0

Sie können 'response.end()' verwenden, um zu verhindern, dass Ihr Anforderungshandler bei Anfragen an favicon.if ausgeführt wird. If (request.url === '/favicon.ico') {response.end(); } 'Ich bin mir nicht sicher, ob es einen anderen Weg gibt. –

+1

@ JDillon522 gibt es Chrome-Erweiterungen, um es zu deaktivieren. – SheetJS

0

sehen Wenn Sie die Ausgabe der Header der Server doch sagen, dass Sie Favicon gefunden, daher die Antwort verarbeitet wird, und egal, was Sie Holen Sie sich das doppelte console.log(). Stattdessen es beenden, bevor ein writeHead() oder senden 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

Senden ich das gleiche Problem selbst habe, und ich fand heraus, dass so etwas wie

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

mit genug ist, um dieses Verhalten zu vermeiden, . Aus irgendeinem Grund, wenn ich req.url überprüfe und es mit '/favicon.ico' vergleicht, wird nichts zur Konsole gesendet, tatsächlich wird alles in diesem Block ignoriert. Ich weiß nicht, ob dieses Verhalten erwartet wird, aber du könntest es wirklich versuchen.

0

in aller Kürze der Vervielfältigung, wie es vor einem Ergebnis der Favicon Anfrage erwähnt wird so dieses Problem zu vermeiden, schlage ich vor, Ihnen diesen einfachen snipet:

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

Es kann auch eine Chrome-Plugin wie JSONView sein . Ich habe nur versucht, es herauszufinden, bis ich inkognito versuchte und erkannte, dass es das Problem nicht mehr verursachte. Fordert auch eine JSON-Datei an.

Verwandte Themen