2016-10-25 2 views
0

Ich habe den folgenden Code:node.js App: neue Fehler werfen (‚Can ‘ t-Header gesetzt, nachdem sie gesendet werden. ")

router.get('/:widget', function(req, res, next) { 
     var widget = req.params.widget; 
     if (! validate(widget)) { 
       res.status(400).send("Invalid widget"); 
       return; 
     } 

     redis.hget("e:" + widget, 'ccid', function (e, d) { 
       if (e){ 
         res.status(500).send("Database query failed"); 
         return; 
       } 
       if (d) { 
         res.status(200).send("Resource found"); 
         return; 
       } else { 
         res.status(400).send("Unknown widget"); 
         return; 
       } 
     }); 

     res.status(200).send("why are you here?"); 
     return; 
}); 

Ich hatte den Eindruck, dass, wenn der Code schlägt ein "return" ... es verlässt die Funktion. Aber was passiert zu sein scheint, ist, dass, wenn die Logik trifft das:

res.status(400).send("Unknown widget"); 
    return; 

Weg, es immer noch die auch

 res.status(200).send("why are you here?"); 
     return; 

trifft. Ich dachte, dass es die Methode verlassen hätte. Klar liege ich falsch ... weil ich die obige Fehlermeldung bekomme. Der Fehler verschwindet, wenn ich res.send() und return() nach dem Aufruf redis.hget lösche.

Was sollte ich anstelle der "Return" -Anweisung nach jedem res.status() verwenden. Send()?

+0

Mit einem 'return' _does_ beenden Sie die Funktion. Aber in deinem Fall verlässt es _callback_ du gehst zu '.hget', du bist immer noch innerhalb' .get ('/: widget' ...) '. – vlaz

Antwort

1

"redis.hget" ist ein asynchroner Aufruf. Da "redis.hget" ein asynchroner Aufruf ist, wird Ihre "router.get" -Funktion weiterhin bis zum Ende ausgeführt, wo sie auf "res.status (200) .send (" Warum bist du hier? ")" Und daher send die Antwort an den Kunden.

Nun wird in der nächsten Ereignisschleife die asynchrone Funktion "redis.hget" ausgeführt, die nach Erhalt der Antwort von Redis sever erneut "res.status (400) .send ..." aufruft. Aber da die Antwort bereits an den Client gesendet wurde, erhalten Sie den Fehler "Header können nach dem Senden nicht gesetzt werden"

1

function (e, d) { ... } ist eine andere Funktion, die asynchron aufgerufen wird.

Bei der Rückkehr von function(req, res, next) { ... } wird die Ausführung dieser Funktion nicht gestoppt (oder umgekehrt).

Da Sie immer eine Antwort von innen function (e, d) { ... } zu senden, ist es nicht sinnvoll, zu versuchen, als auch ein von function(req, res, next) { ... } zu senden.

1

Ihre Rücksendeanweisung befindet sich in einer Rückruffunktion (die Sie an redis.hget() übergeben). Ihre Return-Statements nehmen Sie davon ab, aber dann fahren Sie fort bis zum Ende der router.get() Funktion.

Verwandte Themen