Expressのapp.use()とapp.all()の違いはパスの扱いにある

Node.jsフレームワークのExpressを利用しているとapp.use()app.all()のメソッドの違いがわかりにくいと感じたため両者の違いについて調べた結果を紹介します。

スポンサーリンク

基本的には一緒だがパスの扱い方が異なる

結論から言うと、「リクエストを受け取ると指定した処理を実行する」という基本的な機能は一緒です。ただしパスの扱い方が以下のように異なります。

app.use()app.all()
第一引数のパス任意(省略可能)必須
処理の実行条件リクエストのベースパスが
指定したパスと前方一致する場合
リクエストのパスが
指定したパスと完全に一致する場合

第一引数のパス

app.all()app.METHOD()と同等の扱いとなるため第一引数にパスの指定が必須となります。
つまり下のコードのようにapp.all()で任意のパスを指定するとapp.use()と同じ振る舞いをすることになります。

app.use(middlware) // OK
app.use('hello', middlware) // OK

app.all(middlware) // エラー
app.all('hello', middlware) // OK
app.all('*', middlware) // OK app.use()と同じ振る舞い

処理の実行条件

最大の違いはクライアントからのリクエストパスから判断して処理を実行する条件です。

app.use()ではリクエストのベースパスが引数に指定されたパスに前方一致している場合に処理を実行します。
例えば下のように'/hello'をパスの引数として指定した場合を考えると、以下のようなリクエストパスは全て合致するとみなされてmiddleware関数が実行されます。

app.use('/hello', middleware)

// リクエストバス
/hello        // OK
/hello/       // OK
/hello/hey    // OK

一方でapp.all()ではリクエストのベースパスがが引数に指定されたパスと完全に一致する場合にのみ処理を実行します。そのため、以下のようにリクエストパスによってはmiddleware関数が実行されない場合があるので注意が必要です。

app.all('/hello', middleware)

// リクエストバス
/hello        // OK
/hello/       // OK
/hello/hey    // NG

app.all('/hello/*', middleware)

// リクエストバス
/hello        // NG
/hello/       // OK
/hello/hey    // OK

まとめ

この記事ではExpressのapp.use()app.all()のメソッドの違いについて紹介しました。
調査の結果、基本的には全てのリクエストに共通して処理を実行する場合はapp.use()を利用すれば問題にならないと感じました。

コメント