デバッグログ
エラー応答でデバッグ情報をロギングサービスに送信します。
export default { async fetch(request, env, ctx) { // ログを受信するように設定されたサービス const LOG_URL = "https://log-service.example.com/";
async function postLog(data) { return await fetch(LOG_URL, { method: "POST", body: data, }); }
let response;
try { response = await fetch(request); if (!response.ok && !response.redirected) { const body = await response.text(); throw new Error( "オリジンでの不正な応答。ステータス: " + response.status + " 本文: " + // 文字列がヘッダーとして小さすぎることを確認 body.trim().substring(0, 10), ); } } catch (err) { // ctx.waitUntil()がないと、Cloudflareの // ロギングサービスへのfetch()が完了するかどうかは不明 ctx.waitUntil(postLog(err.toString())); const stack = JSON.stringify(err.stack) || err; // 応答をコピーし、ボディをスタックトレースに初期化 response = new Response(stack, response); // 何が起こったのかを知るためにエラースタックをヘッダーに追加 response.headers.set("X-Debug-stack", stack); response.headers.set("X-Debug-err", err); } return response; },};interface Env {}export default { async fetch(request, env, ctx): Promise<Response> { // ログを受信するように設定されたサービス const LOG_URL = "https://log-service.example.com/";
async function postLog(data) { return await fetch(LOG_URL, { method: "POST", body: data, }); }
let response;
try { response = await fetch(request); if (!response.ok && !response.redirected) { const body = await response.text(); throw new Error( "オリジンでの不正な応答。ステータス: " + response.status + " 本文: " + // 文字列がヘッダーとして小さすぎることを確認 body.trim().substring(0, 10), ); } } catch (err) { // ctx.waitUntil()がないと、Cloudflareの // ロギングサービスへのfetch()が完了するかどうかは不明 ctx.waitUntil(postLog(err.toString())); const stack = JSON.stringify(err.stack) || err; // 応答をコピーし、ボディをスタックトレースに初期化 response = new Response(stack, response); // 何が起こったのかを知るためにエラースタックをヘッダーに追加 response.headers.set("X-Debug-stack", stack); response.headers.set("X-Debug-err", err); } return response; },} satisfies ExportedHandler<Env>;import jsonimport tracebackfrom pyodide.ffi import create_once_callablefrom js import Response, fetch, Headers
async def on_fetch(request, _env, ctx): # ログを受信するように設定されたサービス log_url = "https://log-service.example.com/"
async def post_log(data): return await fetch(log_url, method="POST", body=data)
response = await fetch(request)
try: if not response.ok and not response.redirected: body = await response.text() # エラーをシミュレートします。文字列がヘッダーとして小さすぎることを確認 raise Exception(f'オリジンでの不正な応答。ステータス:{response.status} 本文:{body.strip()[:10]}') except Exception as e: # ctx.waitUntil()がないと、Cloudflareの # ロギングサービスへのfetch()が完了するかどうかは不明 ctx.waitUntil(create_once_callable(post_log(e))) stack = json.dumps(traceback.format_exc()) or e # 応答をコピーし、ヘッダーに追加 response = Response.new(stack, response) response.headers["X-Debug-stack"] = stack response.headers["X-Debug-err"] = e
return response