コンテキスト (ctx)
コンテキストAPIは、WorkerまたはDurable Objectのライフサイクルを管理するためのメソッドを提供します。
コンテキストは以下の場所で公開されています:
- すべてのハンドラーの第3引数として、
fetch()ハンドラーを含む。(fetch(request, env, ctx)) WorkerEntrypointクラスのクラスプロパティとして
ctx.waitUntil()は、Workerのライフタイムを延長し、応答を返すことをブロックせずに作業を実行できるようにし、応答が返された後も続行される可能性があります。これはPromiseを受け入れ、Workersランタイムは、Workerのハンドラーによって応答が返された後でも実行を続けます。
waitUntilは一般的に以下の目的で使用されます:
- 外部分析プロバイダーにイベントを発火させる。(Workers Analytics Engineを使用する場合は、
waitUntilを使用する必要はありません) - Cache APIを使用してアイテムをキャッシュに入れる
waitUntil()は複数回呼び出すことができます。Promise.allSettledに似ており、1つのwaitUntil呼び出しに渡されたPromiseが拒否されても、他のwaitUntil()呼び出しに渡されたPromiseは引き続き実行されます。
例えば:
export default { async fetch(request, env, ctx) { // 元のリクエストを転送/プロキシ let res = await fetch(request);
// カスタムヘッダーを追加 res = new Response(res.body, res); res.headers.set('x-foo', 'bar');
// 応答をキャッシュ // NOTE: ブロック/待機しません ctx.waitUntil(caches.default.put(request, res.clone()));
// 完了 return res; },};passThroughOnExceptionメソッドは、Workerがフェイルオープン ↗し、Workerが未処理の例外をスローしたときにリクエストをオリジンサーバーに通過させることを可能にします。これは、Workerを既存のサービスの前にレイヤーとして使用する際に役立ち、Worker内で発生する予期しないエラーケースをサービスが処理できるようにします。
export default { async fetch(request, env, ctx) { // 未処理/未捕捉の例外時にオリジンにプロキシ ctx.passThroughOnException(); throw new Error('Oops'); },};