リクエストハンドラーの結合
問題
Qwik アプリケーションでは、ミドルウェア機能を実行するために複数のリクエストハンドラーを持つことがよくあります。実際、単一責任の原則によれば、ミドルウェア関数は1つのタスクのみを実行するように開発されています(例:データベース接続の作成)。これらの前提では、複数のリクエストハンドラーを呼び出し順序を維持しながら結合することは複雑になる可能性があります。たとえば、データベースに接続するためのリクエストハンドラーが1つあり、現在のユーザーレコードをロードするための別のリクエストハンドラーがあるとします。後者は前者によって依存するため、順番に呼び出す必要があります。
解決策
複数のリクエストハンドラーを連鎖させたい場合は、このユーティリティ関数を使用できます。
import type { RequestHandler } from '@builder.io/qwik-city';
/**
* Combines multiple request handlers into a single request handler.
*
* The handlers will be called in order:
*
* 1. Handler1 before next()
* 2. Handler2 before next()
* 3. Handler3 before next()
* 4. Next()
* 5. Handler3 after next()
* 6. Handler2 after next()
* 7. Handler1 after next()
*
* @public
*/
export const combineRequestHandlers = (...handlers: RequestHandler[]): RequestHandler =>
async (originalContext) => {
let lastNext = originalContext.next;
for (let i = handlers.length - 1; i >= 0; i--) {
const currentHandler = handlers[i];
const nextInChain = lastNext;
lastNext = async () => {
await currentHandler({ ...originalContext, next: nextInChain });
};
}
await lastNext();
};