2016-08-19 4 views
0

In einer Express-Anwendung würde Ich mag so etwas tun:Express.js Antwort vor Ende der Ausführung senden

app.get('/some/route', someMiddleWare(), function(req, res){ 
    var status = undefined; 
    if(/*someCondition*/) status = 200; 
    else status = 403 

    res.status(status).send(''); 

    // do something else 
}) 

Im ersten Teil habe ich etwas, das notwendig ist, um zu entschlüsseln, welche Antwort zu geben, , in der zweiten (nach send()) mache ich etwas, das in der gleichen Ausführung (dh nicht asynchron) getan werden muss, aber betrifft nicht wirklich den Benutzer. Die Frage ist: Kann ich sicher sein, dass nach send() zurück die Antwort bereits auf dem Weg zurück zum Benutzer ist? Oder wird es erst nach der Ausführung meiner Handler-Funktion gesendet? Danke

Antwort

0

Die Frage ist: kann ich sicher sein, dass nach send() gibt die Antwort ist bereits auf dem Weg zurück an den Benutzer? Oder wird es nur nach der Ausführung meiner Handler-Funktion gesendet?

Ja, Sie können sicher sein, dass die Daten auf dem Weg sind. An dem Punkt, an dem Sie res.send() aufrufen, wurden die Daten in die zugrunde liegende TCP-Infrastruktur geschrieben, und es ist dann Aufgabe des TCP-Stacks, sie zu senden. Aufgrund des TCP-Nagle-Algorithmus kann es eine kurze Verzögerung geben, bevor die Daten gesendet werden, aber in Ihrer Express-Anwendung wird nicht auf irgendetwas gewartet. Die Daten werden gesendet, sobald der TCP-Stack sich dazu entscheidet, sie zu senden.

Es spielt keine Rolle, ob Sie nach dem Senden der Antwort noch etwas im Request-Handler ausführen oder nicht.

Wenn Sie den tatsächlichen Quellcode dafür folgen wollen, schauen Sie sich zuerst res.send(data) in express an, und das führt schließlich zum Aufruf res.end(data) in the http module. Und wenn Sie sich das http-Modul ansehen, können Sie sehen, dass es die Daten beim Aufruf in die TCP-Implementierung synchron schreibt. Es gibt keine magischen Verzögerungen, die darauf warten, dass andere Dinge in Express passieren.

1

Ja. Ihr Code wird in der Funktion ausgeführt, auch nachdem Sie die Daten über res.send() gesendet haben.

Nachdem Sie jedoch res.send() verwenden, können Sie keine weiteren Daten mit derselben Antwort auf diese Anfrage senden.

Verwandte Themen