を理解する前にnext
、ノードのリクエスト/レスポンスサイクルについて少し理解する必要がありますが、詳細はあまりわかりません。これは、特定のリソースに対してHTTPリクエストを作成することから始まり、ユーザーに応答を返すとき、つまりres.send( 'Hello World');のようなものに遭遇したときに終了します。
非常に簡単な例を見てみましょう。
app.get('/hello', function (req, res, next) {
res.send('USER')
})
resp.sendはサイクルを終了し、コントロールをルートミドルウェアに戻すため、ここではnext()は必要ありません。
次に、別の例を見てみましょう。
app.get('/hello', function (req, res, next) {
res.send("Hello World !!!!");
});
app.get('/hello', function (req, res, next) {
res.send("Hello Planet !!!!");
});
ここでは、同じパスに対して2つのミドルウェア関数があります。しかし、あなたはいつも最初のものから応答を受け取るつもりです。それはミドルウェアスタックの最初にマウントされ、res.sendがサイクルを終了するためです。
しかし、「Hello World !!!!」を常に望んでいない場合はどうでしょうか。返答。条件によっては、「Hello Planet !!!!」が必要になる場合があります。応答。上記のコードを変更して、何が起こるか見てみましょう。
app.get('/hello', function (req, res, next) {
if(some condition){
next();
return;
}
res.send("Hello World !!!!");
});
app.get('/hello', function (req, res, next) {
res.send("Hello Planet !!!!");
});
next
ここで何をしていますか。そして、はい、あなたはガスを持っているかもしれません。条件が真の場合、最初のミドルウェア関数をスキップし、次のミドルウェア関数を呼び出すと、"Hello Planet !!!!"
応答が返されます。
したがって、次に、ミドルウェアスタック内の次の関数に制御を渡します。
最初のミドルウェア関数が応答を返さず、ロジックの一部を実行し、次に2番目のミドルウェア関数から応答を受け取った場合はどうなるでしょう。
以下のようなもの:-
app.get('/hello', function (req, res, next) {
// Your piece of logic
next();
});
app.get('/hello', function (req, res, next) {
res.send("Hello !!!!");
});
この場合、両方のミドルウェア機能を呼び出す必要があります。したがって、2番目のミドルウェア関数に到達する唯一の方法は、next()を呼び出すことです。
次への呼び出しを行わないとどうなるでしょう。2番目のミドルウェア関数が自動的に呼び出されることを期待しないでください。最初の関数を呼び出した後、リクエストはハングしたままになります。2番目の関数は呼び出されず、応答も返されません。
res.send
してリクエストを完了する可能性があります。存在しない場合は、エラーを発行してリクエストを完了する別のハンドラが存在する可能性があります。