Ich frage mich, welche Mechanismen hinter dem Verhalten des folgenden Codes stehen:
res.send(200, { data: 'test data' });
console.log('still here...');
Mein Verständnis ist, dass die Funktion res.send
nicht zurückgegeben wird, sondern die Verbindung geschlossen / die Anforderung beendet wird . Dies könnte erklären, warum ich nach einem res.send
Befehl immer noch Code ausführen kann (ich habe die Express-Quelle durchgesehen und es scheint keine asynchrone Funktion zu sein).
Gibt es noch etwas im Spiel, das mir möglicherweise fehlt?
send
, leiten Sie einfach Daten über die http-Verbindung weiter und Ihr Code wird fortgesetzt. Sie können nur verwenden,return
wenn Sie den Code beenden oder einfach nichts anderes schreiben möchten. Entschuldigung für die Fehlinterpretation.Antworten:
Sicher
end
beendet die HTTP-Antwort, aber es hat nichts Besonderes mit Ihrem Code zu tun.Sie können andere Dinge auch dann tun, wenn Sie eine Antwort beendet haben.
Was Sie jedoch nicht tun können, ist etwas Nützliches zu tun
res
. Da die Antwort beendet ist, können Sie keine weiteren Daten darauf schreiben.res.send(...); res.write('more stuff'); // throws an error since res is now closed
Dieses Verhalten unterscheidet sich von anderen herkömmlichen Frameworks (PHP, ASP usw.), die einer HTTP-Anforderung einen Thread zuweisen und den Thread beenden, wenn die Antwort beendet ist. Wenn Sie eine äquivalente Funktion wie die von ASP aufrufen
Response.End
, wird der Thread beendet und Ihr Code wird nicht mehr ausgeführt. Im Knoten gibt es keinen Thread zum Stoppen.req
und esres
werden keine weiteren Ereignisse ausgelöst, aber der Code in Ihren Rückrufen kann weiterhin ausgeführt werden (solange nicht versucht wird, Methoden aufzurufen, fürres
die eine gültige Antwort erforderlich ist, um geöffnet zu sein).quelle
Bearbeiten: Ich mache nicht mehr das, was unten erklärt wird, da Sie keinen Wert zurückgeben sollten, wenn es nicht nötig ist. Es macht Ihren Code weniger lesbar und sieht hackisch aus. Stattdessen schlage ich vor, die return-Anweisung von der zu trennen
res.send()
. @slavafomin hat dies in den Kommentaren gut erklärt.Eine einfache Möglichkeit, die Ausführung der Funktion zu stoppen und gleichzeitig eine Antwort zu senden, besteht darin, dies zu tun
return res.send('500', 'Error message here');
Auf diese Weise können Sie kurze
if
Anweisungen verwenden, um Fehler zu behandeln, z.if (err) { return res.send('500', 'Error message here'); }
Die genaue Rückgabe der
res.send
Funktion ist ein Objekt , das den gesamten Status der Verbindung nach dem Beenden zu enthalten scheint (Anforderung, Status, Header usw.). Dies sollte jedoch unwichtig sein, da Sie nichts damit tun.quelle
res.send('500', 'Error message here');return;
inside-if
Anweisung.