掲題の通りです。
Express アプリケーションで使用するミドルウェアの作成
ミドルウェアの使用
の辺を見てもいまいちしっくりきません。
結局どういう時にnext()
が必要で、どういう時は記載の必要がないか分かりませんでした。
もし砕いてご説明頂ける方、いらしたらよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
Node.jsというか、元になっているJavaScriptの話ですが、
イベントを関数として保存しておき、然るべきタイミングで引っ張り出して使うという思想になっています。
そのため、JSに於ける関数というのは以下のように普通の値と同じような挙動が行えます
- 関数を変数に保存できる
- 関数を関数の引数として設定できる
- 関数を関数の戻り値として設定できる
上記の前提を元に本題です。
JS
1app.get('/', function (req, res, next) { 2});
これは、app.getメソッドを実行するコードです。
第一引数がパスになる文字列で、第二引数が関数ですね。
JSではこのように関数実行時に使い捨ての無名関数を引数として渡して、
xx条件を満たしたら、引数として渡した関数を実行しておいてねという作りになっています。
ExpressはHTTPリクエストを待ち受けるWebサーバとして駆動しつつ、
然るべきパスへアクセスが来たらこの第二引数として指定した関数を実行するのです。
実行ルールはExpressに書いてありますね。
第一引数がreq、第二引数がres、第三引数がnext固定です。
別にこれの引数名を変更しても問題はありませんが、関数実行時の渡される順番を制御出来るわけではありませんから、慣習通りreq, res, next
の順番が良いでしょう。
最後にこのnext引数ですが、
Expressの思想ではヒットした瞬間に動作を停止します。
そこでres.end('hogehoge')
等の文字列をクライアントに返して終わりなんです。
例えば下記のように処理Aでreqやresのオブジェクトを使いやすいように改変したとしても、
処理Aの中でリクエストは終了したものだとExpressは解釈しますので、処理Bは動作しません。
JS
1app.get('/', function (req, res, next) { 2 // 処理A 3 console.log('A'); 4}); 5app.get('/', function (req, res, next) { 6 // 処理Bは動作しない 7 console.log('B'); 8});
そこで登場するのが第三引数のnextです。
これを関数内で実行することで、処理Aは中継しただけなんだ!と明示することになります。
JS
1app.get('/', function (req, res, next) { 2 // 処理A 3 console.log('A'); 4 next(); 5}); 6app.get('/', function (req, res, next) { 7 // 処理Bは多分動作するので確認してみてね 8 console.log('B'); 9});
POSTパラメータを解析するbody-parserが有名ですが、
クッキーを解析するミドルウェア、POST値を精査するバリデート処理などなど…様々なロジックが考えられますね。
そういうサポート的な事だけをしますよって意味でミドルウェアというわけです。
投稿2018/11/07 06:24
総合スコア21384
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/07 07:22
2020/03/25 21:40
2020/03/26 00:41