エラーと例外
Workersのエラーと例外を確認します。
本番環境で実行中のWorkerが応答を返すことを妨げるエラーが発生した場合、クライアントは以下のように定義されたエラーコードを含むエラーページを受け取ります。
| エラーコード | 意味 |
|---|---|
1101 | WorkerがJavaScript例外をスローしました。 |
1102 | WorkerがCPU時間制限を超えました。 |
1103 | このWorkerの所有者はCloudflareサポートに連絡する必要があります。 |
1015 | Workerがバーストレート制限に達しました。 |
1019 | Workerがループ制限に達しました。 |
1021 | Workerがアクセスできないホストを要求しました。 |
1022 | CloudflareがリクエストをWorkerにルーティングできませんでした。 |
1024 | WorkerはCloudflare所有のIPアドレスにサブリクエストを行うことができません。 |
1027 | Workerが無料プランの1日リクエスト制限を超えました。 |
1042 | Workerが同じゾーン内の別のWorkerから取得しようとしましたが、これはサポートされていません。 |
他の11xxエラーは一般的にWorkersランタイム自体に問題があることを示します。エラーが発生している場合は、ステータスページ ↗を参照してください。
Workerは自分自身または他のWorkerを16回以上呼び出すことはできません。Worker間の無限ループを防ぐために、CF-EW-Viaヘッダーの値は、残りの呼び出し回数を示す整数です。Workerが呼び出されるたびに、この整数は1ずつ減少します。カウントがゼロに達すると、1019エラーが返されます。
一部のリクエストは、エラーメッセージにスクリプトは応答を生成しませんを含む1101エラーを返すことがあります。これは、Workersランタイムがリクエストに関連するすべてのコードが実行され、イベントループに残っているイベントがないことを検出したが、応答が返されていない場合に発生します。
これは、応答を返すために必要なPromiseが解決または拒否されないことに依存している場合に最も一般的に発生します。デバッグするには、コードや依存関係のコード内で応答をブロックしているPromiseを探し、それらが解決または拒否されることを確認してください。
ブラウザや他のJavaScriptランタイムでは、同等のコードが無限にハングし、バグやメモリリークを引き起こします。Workersランタイムは、デバッグを助けるために明示的なエラーをスローします。
以下の例では、応答が決して発生しないPromiseの解決に依存しています。resolveコールバックのコメントを外すことで問題が解決します。
export default { fetch(req) { let response = new Response("Example response"); let { promise, resolve } = Promise.withResolvers();
// Promiseが解決されない場合、Workersランタイムは // これを認識し、エラーをスローします。
// setTimeout(resolve, 0)
return promise.then(() => response); },};WebSocketがサーバー側の接続を閉じるための適切なコードを欠いている場合、Workersランタイムはスクリプトは応答を生成しませんエラーをスローします。以下の例では、クライアントからの'close'イベントがserver.close()を呼び出すことで適切に処理されておらず、エラーがスローされます。これを避けるために、WebSocketのサーバー側の接続がイベントリスナーや他のサーバー側のロジックを介して適切に閉じられていることを確認してください。
async function handleRequest(request) { let webSocketPair = new WebSocketPair(); let [client, server] = Object.values(webSocketPair); server.accept();
server.addEventListener('close', () => { // この欠落した行はWebSocket接続を無限に開いたままにし、 // "スクリプトは応答を生成しません"エラーを引き起こします
// server.close(); });
return new Response(null, { status: 101, webSocket: client, });}エラーメッセージTypeError: 不正な呼び出し: 関数が不正なthis参照で呼び出されましたは混乱の原因となることがあります。
これは通常、thisを呼び出す関数を呼び出すことによって引き起こされますが、thisの値が失われています。
例えば、thisに依存するロジックを持つobjオブジェクトのobj.foo()メソッドがある場合、obj.foo();を実行するとthisが正しくobjオブジェクトを参照します。しかし、メソッドを変数に割り当て、例えばconst func = obj.foo;としてその変数を呼び出すと、func();はthisがundefinedになります。これは、メソッドがスタンドアロン関数として呼び出されるときにthisが失われるためです。これはJavaScriptの標準的な動作です。
実際には、thisの存在に依存する関数を持つランタイム提供のJavaScriptオブジェクトを分解する際によく見られます。
以下のコードはエラーを引き起こします:
export default { async fetch(request, env, ctx) { // ctxを分解するとwaitUntilが'this'参照を失います const { waitUntil } = ctx; // waitUntilは'this'がないためエラーになります waitUntil(somePromise);
return fetch(request); }}エラーを避けるために、分解を避けるか、関数を元のコンテキストに再バインドしてください。
以下のコードは正常に実行されます:
export default { async fetch(request, env, ctx) { // ctx上でメソッドを直接呼び出すことでエラーを回避します ctx.waitUntil(somePromise);
// またはapply、call、またはbindを介してctxに再バインドすることでエラーを回避します const { waitUntil } = ctx; waitUntil.apply(ctx, [somePromise]); waitUntil.call(ctx, somePromise); const reboundWaitUntil = waitUntil.bind(ctx); reboundWaitUntil(somePromise);
return fetch(request); }}これらのエラーは、Workerがアップロードまたは変更されたときに発生します。
| エラーコード | 意味 |
|---|---|
10006 | Workerのコードを解析できませんでした。 |
10007 | Workerまたはworkers.devサブドメインが見つかりません。 |
10015 | アカウントはWorkersを使用する権利がありません。 |
10016 | 無効なWorker名。 |
10021 | 検証エラー。詳細については検証エラーを参照してください。 |
10026 | リクエストボディを解析できませんでした。 |
10027 | あなたのWorkerはXX MBのサイズ制限を超えました。 |
10035 | 同時にリソースを変更しようとする複数の試行 |
10037 | アカウントが許可されているWorkersの数を超えました。 |
10052 | 名前なしでバインディングがアップロードされました。 |
10054 | 環境変数またはシークレットがサイズ制限を超えています。 |
10055 | 環境変数またはシークレットの数が制限/Workerを超えています。 |
10056 | バインディングが見つかりませんでした。 |
10068 | アップロードされたWorkerには登録されたevent handlersがありません。 |
10069 | アップロードされたWorkerにはWorkersランタイムでサポートされていないevent handlersが含まれています。 |
10021エラーコードには、Workerをデプロイしようとしたときに発生するすべてのエラーが含まれ、Cloudflareがその後、トップレベルスコープ(あなたのWorkerのハンドラーが呼び出される前に発生するすべてのこと)を読み込んで実行しようとします。例えば、無効なJavaScriptを持つ壊れたWorkerをデプロイしようとすると、CloudflareはあなたのWorkerをデプロイしません。
特定のエラーケースには、以下が含まれますが、これに限定されません:
Workerは、Workers有料プランで圧縮後最大10 MB、Workers無料プランで最大1 MBのサイズにすることができます。
Workerのアップロードサイズを減らすには、不必要な依存関係を削除するか、Workers KV、D1データベース、またはR2を使用して構成ファイル、静的アセット、バイナリデータをWorkerコード内にバンドルするのではなく保存することを検討してください。
Workerのファイルサイズを減らす別の方法は、その機能を複数のWorkerに分割し、サービスバインディングを使用して接続することです。
これは、Workerのトップレベルスコープで行っている作業が起動時間制限(400ms)のCPU時間を超えていることを意味します。
これは通常、コードや依存関係にバグや大きなパフォーマンス問題があることを示しています。アプリが起動するときに400ms以上のCPU時間を使用することは一般的ではありません。Workerのコードがトップレベルスコープの解析と実行に費やす時間が長いほど、コード変更をデプロイしたり新しいアイソレートが作成されたりするときにWorkerが遅くなります。
このエラーは、通常、トップレベル(グローバル)スコープで高価な初期化作業を直接行おうとすることによって引き起こされます。例えば、大きなスキーマを生成または消費することによってアプリを初期化しようとすることです。
CPU時間を消費しているものを分析するには、WorkerのChrome DevToolsを開き、プロファイリングやパフォーマンスパネルを見て、どこに時間がかかっているかを理解してください。Workerに最初にリクエストを送信するときに、特に大量のCPU時間を消費する明らかなものはありますか?
ランタイムエラーはランタイム内で発生し、エラーページを表示せず、エンドユーザーには表示されません。ランタイムエラーは、ユーザーがログで検出します。
| エラーメッセージ | 意味 |
|---|---|
ネットワーク接続が失われました | 接続の失敗。fetchまたはバインディングの呼び出しをキャッチして再試行してください。 |
メモリ制限を超えるEOFの前に | ストリームまたはバッファを読み取ろうとして、メモリ制限を超えようとしています。 |
daemonDown | Workerを呼び出す際の一時的な問題。 |
アプリケーションがダウンタイムを経験しているか、エラーを返しているかを確認するには:
- Cloudflareダッシュボード ↗にログインし、アカウントを選択します。
- アカウントホームで、Workers & Pagesを選択します。
- 概要で、Workerを選択し、Workerのメトリクスを確認します。
Workersアプリケーションが例外を返していることを特定した後、wrangler tailを使用して例外を検査し、修正します。
例外は、wrangler tailによって返されるJSONのexceptionsフィールドに表示されます。エラーを引き起こしている例外を特定したら、修正を加えたコードを再デプロイし、修正が確認できるまでログを引き続き監視します。
Workerは、公共のインターネット上の任意のHTTPサービスにHTTPリクエストを行うことができます。エラーを報告するためにサービスにHTTPリクエストを行うことで、Sentry ↗のようなサービスを使用してWorkerからエラーログを収集できます。どのようなリクエストを行うかについては、サービスのAPIドキュメントを参照してください。
外部ロギング戦略を使用する際は、ワーカーがクライアントにメインレスポンスボディを送信し終わると、未処理の非同期タスクがすぐにキャンセルされることを忘れないでください。ロギングのサブリクエストが完了することを保証するために、リクエストのプロミスを event.waitUntil() ↗ に渡します。例えば:
export default { async fetch(request, env, ctx) { function postLog(data) { return fetch("https://log-service.example.com/", { method: "POST", body: data, }); }
// ctx.waitUntil() がないと、`postLog` 関数は完了するかもしれないし、しないかもしれません。 ctx.waitUntil(postLog(stack)); return fetch(request); }}addEventListener("fetch", (event) => { event.respondWith(handleEvent(event));});
async function handleEvent(event) { // ...
// event.waitUntil() がないと、`postLog` 関数は完了するかもしれないし、しないかもしれません。 event.waitUntil(postLog(stack)); return fetch(event.request);}
function postLog(data) { return fetch("https://log-service.example.com/", { method: "POST", body: data, });}event.passThroughOnException を使用することで、ワーカーの実行中に例外がスローされた場合、ワーカーアプリケーションはリクエストをオリジンに転送します。これにより、アプリケーションの機能を損なうことなく、ワーカーを使用してロギング、トラッキング、またはその他の機能を追加できます。
export default { async fetch(request, env, ctx) { ctx.passThroughOnException(); // ここでエラーが発生すると、ワーカーが存在しないかのようにオリジンのレスポンスが返されます。 return fetch(request); }}addEventListener("fetch", (event) => { event.passThroughOnException(); event.respondWith(handleRequest(event.request));});
async function handleRequest(request) { // ここでエラーが発生すると、ワーカーが存在しないかのようにオリジンのレスポンスが返されます。 // ... return fetch(request);}- Workersからのログ - Workersのログの取り方を学びます。
- Logpush - Workersトレースイベントログをサポートされている宛先にプッシュする方法を学びます。
- RPCエラーハンドリング - リモートプロシージャコールからのエラーを処理する方法を学びます。