nodejs - http.createServer scheint zweimal aufzurufen


78

Wenn ich folgendes Programm in Node schreibe:

  http.createServer(function (req, res) {

    if( req.method == 'GET' ) {
      var body = ''; req.on('data', function(data) { body += data });
      req.on('end',  function() {
        console.log('request ended')
      });
    }

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('142\n');
  }).listen(3500);

Und dann drücke den Server mit http://xxx.xx.xxx.xx:35010einem request endedzweimal auf meiner Konsole - ich bin mir nicht sicher, warum eine einzelne HTTP-Anfrage dazu führt, dass dies zweimal ausgeführt wird.


1
Mögliches Duplikat der Seitenaktualisierung
GSee

@Jessemon Wenn eine Frage ein Duplikat ist, stimmen Sie ab, um sie als Duplikat zu schließen, anstatt die Frage zu bearbeiten.
GSee

Antworten:


165

Das ist normal - Ihr Browser tätigt mehr als einen Anruf.

Die meisten Browser rufen zum /favicon.icoBeispiel an, um zu greifen .

Versuchen Sie, die URL zu protokollieren:

console.log(req.url);

und du wirst sehen, wie es heißt.


Das mag albern sein, aber was ist der genaue Grund dafür, dass response.write ("Hi") nicht zweimal angezeigt wird, wenn es hinzugefügt wird?
Navin Nagpal

Jede Abfrage erhält es einmal. Die Favicon-Anfrage wird abgerufen und verworfen. Es handelt sich nicht um einen Symbolinhalt, und die reguläre http-Anfrage für eine HTML-Seite zeigt sie an.
3on

Wie ist es normal, dass ich versuche, ein Inkrement in meinem createServer-Code durchzuführen und zweimal aufgerufen zu werden, was die Ergebnisse völlig durcheinander bringt.
Muhammad Babar

Ich habe das gleiche Problem, aber ich verstehe die Antworten, die den Link mit favicon sprechen, nicht: Beim zweiten Aufruf finde ich in "req.url" den gleichen Pfad wie beim ersten Aufruf. Dieser Fehler wird ärgerlich, sobald ich den Knotenserver dedugge, weil ich zwischen zwei Threads jongliere, die die gleichen Dinge parallel ausführen.
Didier68

16

Im Allgemeinen favicon.icowird von den Browsern abgerufen. Also die beiden Anrufe.

Die Lösung für dieses Problem kann darin bestehen, nach der Anforderungs-URL zu suchen, ob sie abgerufen wird favicon.icooder nicht.

http.createServer(function (req, res) {
    if (req.url != '/favicon.ico') {
        // do your stuffs
    }
}).listen(3500);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.