2016-08-19 9 views
0

の終了前に応答を送信します。最初の部分でExpress.jsは、私がこのような何かをしたいと思いExpressアプリケーションで実行

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

を私が与えるために何の応答デコードするために必要とされている何かをします(send()の後に)同じ実行で(つまり非同期ではなく)実行する必要があるが、本当にユーザーに関係しない何かを追加します。 質問は:私はsend()の返信後に応答がすでにそのユーザーに戻っていることを確認できますか?または、それは私のハンドラ関数の実行後にのみ送信されますか? ありがとう

答えて

0

質問です:私はsend()戻った後、応答 が戻ってユーザーに向かう途中で、すでにあることを確認することができますか?または、ハンドラ関数の実行が の場合にのみ送信されますか?

はい、データが途中にあることを確認できます。 res.send()と呼ぶ時点で、そのデータは基盤となるTCPインフラストラクチャに書き込まれ、それを送信するためにTCPスタックまでになります。 TCP Nagleアルゴリズムのおかげで、データが送信されるまでに少しの遅延があるかもしれませんが、Expressアプリケーションでは何も待っていません。データは、TCPスタックが送信を決定するとすぐに送信されます。

応答を送信した後でも、リクエストハンドラで何か他の処理を行っているかどうかは関係ありません。

実際のソースコードに従う場合は、まずres.send(data) in expressを参照し、最終的にはres.end(data) in the http moduleを呼び出します。また、httpモジュールを見ることで、呼び出されたときに同期してTCP実装にデータを書き込んでいることがわかります。エクスプレスで他のことが起こるのを待つ魔法の遅れはありません。

1

はい。 res.send()でデータを送信した後でも、コードは関数内で実行されます。

ただし、res.send()を使用した後は、その要求と同じ応答の他のデータを送信できなくなります。

関連する問題