🤖

Expressにおけるミドルウェア

2022/03/10に公開

ミドルウェア関数とは

ミドルウェア関数とは、アプリケーションのリクエスト-レスポンスのやりとにおいて、
リクエストオブジェクト(req)、レスポンスオブジェクト(res)、next middleware関数にアクセスすることができる関数です。

next middleware関数は、一般にnextという変数で示されます。

ミドルウェア関数は次のような処理を行うことができます。

1 任意のコードを実行する
2 リクエストオブジェクトとレスポンスオブジェクトを変更する。
3 リクエスト-レスポンスのやりとりを終了させる。
4 スタック内の次のミドルウェア関数を呼び出す。
5 現在のミドルウェア関数がリクエスト・レスポンスサイクルを終了しない場合、 next()を呼び出して次のミドルウェア関数に制御を移す必要がある。そうでなければ、リクエストは放置されたままになる。

アプリケーションレベルのミドルウェア

app.use()およびapp.METHOD()関数を使用して、アプリケーションレベルのミドルウェアをアプリオブジェクトのインスタンスにバインドします。ここで、METHODは、ミドルウェア関数が処理するリクエストのHTTPメソッドです(GETなど)。 、PUT、またはPOST)を小文字で入力します。

この例では、マウントパスを指定しないミドルウェア関数を示しています。この関数は、アプリがリクエストを受信するたびに実行されます。

const express = require('express')
const app = express()

app.use(function (req, res, next) {)
  console.log('時間:', Date.now())
  next()
})

この例では、/user/:idのパスにミドルウェアの関数をマウントしています。この関数は、/user/:id パス上のあらゆる種類の HTTP リクエストに対して実行されます。

app.use('/user/:id', function (req, res, next) {)
  console.log('リクエストタイプ:', req.method)
  next()
})

ルータレベルのミドルウェア

ルータレベルのミドルウェアは、express.Router()のインスタンスにバインドされる以外は、アプリケーションレベルのミドルウェアと同じように動作します。

const router = express.Router()
router.use()関数とrouter.METHOD()関数を使用して、ルータレベルのミドルウェアをロードします。

次のコード例では、上で示したアプリケーションレベルのミドルウェアのシステムを、ルーターレベルのミドルウェアで再現しています。

const express = require('express')
const app = express()
const router = express.Router()
// マウントパスのないミドルウェア関数です。このコードは、ルーターへのリクエストごとに実行されます。
router.use(function (req, res, next) {)
  console.log('時間:', Date.now())
  next()
})

Discussion