コンテンツにスキップ

ミドルウェア

ミドルウェアは、onRequest 関数の前に実行できる再利用可能なロジックです。ミドルウェアは通常、ユーティリティ関数です。エラーハンドリング、ユーザー認証、ロギングは、アプリケーション内のミドルウェアの典型的な候補です。

ミドルウェアの追加

ミドルウェアは標準のページ関数に似ていますが、ミドルウェアは常にプロジェクトの /functions ディレクトリ内の _middleware.js ファイルで定義されます。_middleware.js ファイルは、onRequest 関数をエクスポートします。ミドルウェアは、同じ /functions ディレクトリ内のページ関数に一致するリクエストで実行され、サブディレクトリも含まれます。たとえば、functions/users/_middleware.js ファイルは、/functions/users/nevi/functions/users/nevi/123、および functions/users へのリクエストに一致します。

アプリケーション全体でミドルウェアを実行したい場合は、静的ファイルの前でも、functions/_middleware.js ファイルを作成します。

_middleware.js ファイルでは、onRequest ハンドラーまたはそのメソッド固有のバリアントをエクスポートできます。以下は、プロジェクトのページ関数でスローされたエラーを処理するミドルウェアの例です。この例では、リクエストハンドラーのコンテキストオブジェクトで利用可能な next() メソッドを使用しています:

export async function onRequest(context) {
try {
return await context.next();
} catch (err) {
return new Response(`${err.message}\n${err.stack}`, { status: 500 });
}
}

ミドルウェアのチェーン

ページ関数の配列をミドルウェアハンドラーとしてエクスポートできます。これにより、実行したい複数のミドルウェアをチェーンすることができます。以下の例では、プロジェクトの関数から生成されたエラーを処理し、ユーザーが認証されているかどうかを確認できます:

async function errorHandling(context) {
try {
return await context.next();
} catch (err) {
return new Response(`${err.message}\n${err.stack}`, { status: 500 });
}
}
function authentication(context) {
if (context.request.headers.get("x-email") != "admin@example.com") {
return new Response("Unauthorized", { status: 403 });
}
return context.next();
}
export const onRequest = [errorHandling, authentication];

上記の例では、errorHandling 関数が最初に実行されます。これにより、authentication 関数内のエラーや、他のすべての後続のページ関数内のエラーをキャッチします。