ミドルウェア
ミドルウェアにより、リクエストとレスポンスをインターセプトし、ページやエンドポイントがレンダリングされる直前に動的に振る舞いを注入できます。
また、すべてのAstroコンポーネントとAPIエンドポイントで利用可能なlocals
オブジェクトを変更し、リクエスト固有の情報を各エンドポイントとページで設定・共有することもできます。
ミドルウェアはSSGとSSRのAstroプロジェクトの両方で利用可能です。
基本的な使い方
-
src/middleware.js|ts
というファイルを作成します。(あるいは、src/middleware/index.js|ts
を作成しても構いません。) -
このファイルの中で、
onRequest()
関数をエクスポートします。これをデフォルトエクスポートにしてはいけません。 -
.astro
ファイルの中で、Astro.locals
を使ってレスポンスデータにアクセスします。
ミドルウェアの型
defineMiddleware()
ユーティリティ関数をインポートして使用すると、型安全性を確保できます。
JsDocにより型を記述している場合は、MiddlewareRequestHandler
を使用できます。
Astro.locals
内の情報に型を付け、.astro
ファイルとミドルウェアの両コードで自動補完を有効化するには、env.d.ts
ファイルでグローバル名前空間を宣言します。
これにより、ミドルウェアファイル内で自動補完が有効になり、型安全性が確保されます。
Astro.locals
には、文字列、数値、さらには関数やマップといった複雑なデータ型など、どんな型のデータでも格納できます。
そして、任意の.astro
ファイル内でこの情報を利用できます。
センシティブな情報を消去する例
以下の例では、ミドルウェアを使用して「極秘情報」という文字列を「削除済み」という語に置き換えることで、変更されたHTMLをページにレンダリングできるようにします。
ミドルウェアを連結する
sequence()
を使用して、複数のミドルウェアを指定した順序で連結できます。
これにより、以下の順序でコンソールに出力されます。
APIリファレンス
onRequest()
src/middleware.js
からエクスポートされる必須の関数で、各ページやAPIルートのレンダリングの前に呼び出されます。2つのオプション引数、contextとnext()を受け取ります。onRequest()
は、Response
を返す必要があります。直接、またはnext()
を呼び出してください。
context
レンダリング処理中に、他のミドルウェア、APIルート、.astro
ルートで利用可能な情報を含むオブジェクトです。
これはonRequest()
に渡されるオプション引数で、locals
オブジェクトや、レンダリング中に共有されるその他のプロパティを含む場合があります。たとえばcontext
オブジェクトには、認証に使用されるクッキーを含められます。
これはAPIルートに渡されるcontext
(EN)オブジェクトと同じものです。
next()
Request
のResponse
をインターセプトする(読み取り、変更を加える)か、ミドルウェアのチェーン内の「次の」ミドルウェアを呼び出してResponse
を返すための関数です。たとえばこの関数を用いて、レスポンスのHTML本文を変更できます。
これはonRequest()
のオプション引数で、ミドルウェアが返す必要のあるResponse
を提供します。
locals
ミドルウェア内で変更可能な、Response
からのデータを含むオブジェクトです。
このlocals
オブジェクトは、リクエスト処理のプロセスを通じて転送されていき、APIContext
(EN)とAstroGlobal
のプロパティとして利用できます。これにより、ミドルウェア、APIルート、.astro
ページ間でデータを共有できます。ユーザーデータなど、リクエスト固有のデータを各レンダリングステップをまたいで保持するために役立ちます。
locals
は単一のAstroルーティング内で生成・消滅します。ルーティングされたページがレンダリングされると、locals
はもう存在せず、その後また新しいものが作成されます。複数のページリクエストをまたいで保持されるべき情報は、別の場所に保存する必要があります。
locals
の値は実行時に上書きできません。それをした場合、ユーザーが保存した情報がすべて消去される可能性があるためです。dev
モードにおいてAstroはこれを監視し、locals
が上書きされた場合にエラーをスローします。
sequence()
ミドルウェア関数を引数として受け取り、渡された順序で実行する関数です。
createContext
Astroミドルウェアで使用可能なAPIContext
(EN)を作成するための低レベルなAPIです。
この関数は、Astroミドルウェアをプログラムから実行する目的で、インテグレーションとアダプターから使用できます。
trySerializeLocals
任意の値を受け取り、それをシリアライズした文字列を返す低レベルなAPIです。値をシリアライズできない場合、この関数はランタイムエラーをスローします。
Learn