コンテンツにスキップ

POSTリクエストのキャッシュ

Cache POSTリクエストをCache APIを使用してキャッシュします。

export default {
async fetch(request, env, ctx) {
async function sha256(message) {
// UTF-8としてエンコード
const msgBuffer = await new TextEncoder().encode(message);
// メッセージをハッシュ化
const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
// バイトを16進数文字列に変換
return [...new Uint8Array(hashBuffer)]
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
}
try {
if (request.method.toUpperCase() === "POST") {
const body = await request.clone().text();
// キャッシュキーの一部としてリクエストボディをハッシュ化
const hash = await sha256(body);
const cacheUrl = new URL(request.url);
// ボディのハッシュを前に付けてURLをキャッシュに保存
cacheUrl.pathname = "/posts" + cacheUrl.pathname + hash;
// キャッシュ可能にするためにGETに変換
const cacheKey = new Request(cacheUrl.toString(), {
headers: request.headers,
method: "GET",
});
const cache = caches.default;
// キャッシュ内でキャッシュキーを探す
let response = await cache.match(cacheKey);
// そうでなければ、オリジンからPOSTリクエストのレスポンスを取得
if (!response) {
response = await fetch(request);
ctx.waitUntil(cache.put(cacheKey, response.clone()));
}
return response;
}
return fetch(request);
} catch (e) {
return new Response("エラーが発生しました " + e.message);
}
},
};