質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

15795閲覧

nodejs express の next()って結局なんですか?

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

1グッド

3クリップ

投稿2018/11/07 04:58

掲題の通りです。

Express アプリケーションで使用するミドルウェアの作成
ミドルウェアの使用

の辺を見てもいまいちしっくりきません。
結局どういう時にnext()が必要で、どういう時は記載の必要がないか分かりませんでした。

もし砕いてご説明頂ける方、いらしたらよろしくお願いします。

ask.traceroute👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/07 07:22

感動しました、ご丁寧にありがとうございます。何回も読み返しました。 質問内にある「ミドルウェア」の意味がしっくりこなかった点に関しても解決しました。 まだ console.log('B') の出力は未確認ですが、next()という命名についても しっくりきましたし、きっと出力されるに違いないですね!笑 本当にありがとうございます!
lirlia

2020/03/25 21:40

同じ疑問でたどり着きました。 環境があったので試してみました ``` app.get('/', function(req, res, next) { console.log("A") next() }); app.get('/', function(req, res, next) { console.log("B") }); ``` で試したところ、きちんと以下のように表示されました。 ``` A B ```
miyabi-sun

2020/03/26 00:41

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問