tencent cloud

Tencent Cloud EdgeOne

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

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-15 18:25:50
AI翻訳
このサンプルは、POSTリクエストのbodyに対してSHA-256署名を計算し、キャッシュキーの一部として使用します。そして、Cache APIを使用してレスポンス内容をキャッシュします。キャッシュが存在する場合は、キャッシュ内容を使用してクライアントに応答します。存在しない場合は、Fetch APIを使用してサブリクエストを発行し、リモートリソースを取得します。これにより、エッジ関数を使用してPOSTリクエストをキャッシュすることを実現します。

サンプルコード

function uint8ArrayToHex(arr) {
return Array.prototype.map.call(arr, (x) => (('0' + x.toString(16)).slice(-2))).join('');
}

// sha256 署名ダイジェスト
async function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);

return uint8ArrayToHex(new Uint8Array(hashBuffer));
}

async function fetchContent(event, cacheKey) {
const cache = caches.default;

// キャッシュがヒットしなかったため、オリジンにアクセスしてキャッシュを使用します。
const response = await fetch(event.request);

// レスポンスヘッダーにCache-Controlを追加し、キャッシュ時間を設定します。
response.headers.set('Cache-Control', 's-maxage=10');
event.waitUntil(cache.put(cacheKey, response.clone()));

// キャッシュがヒットしなかったため、レスポンスヘッダーに識別子を設定します。
response.headers.append('x-edgefunctions-cache', 'miss');

return response;
}

async function handleRequest(event) {
const request = event.request;
const body = await request.clone().text();

// // request bodyに基づいてハッシュを計算します。
const hash = await sha256(body);

// request bodyから計算したハッシュ値をcacheKeyの一部として使用します。
const cacheKey = `${request.url}${hash}`;

const cache = caches.default;

try {
// 関連するキャッシュResponseを取得します。
let response = await cache.match(cacheKey);

if (!response) {
return fetchContent(event, cacheKey);
}

// キャッシュにヒットしたため、レスポンスヘッダーに識別子を設定します。
response.headers.append('x-edgefunctions-cache', 'hit');

return response;
} catch (error) {
await cache.delete(cacheKey);
// キャッシュが期限切れまたは存在しないため、リモートリソースを再取得します。
return fetchContent(event, cacheKey);
}

return response;
}

addEventListener('fetch', (event) => {
try {
const request = event.request;
// POSTリクエストを処理します。
if (request.method.toUpperCase() === 'POST') {
return event.respondWith(handleRequest(event));
}
// post以外のリクエストです。
return event.respondWith(fetch(request));
} catch (e) {
return event.respondWith(new Response('Error thrown ' + e.message));
}
});

サンプルプレビュー

ブラウザのアドレスバーにエッジ関数のトリガールールに一致するURLを入力すると、サンプル効果をプレビューできます。
}

キャッシュにヒットしました。


関連参考

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック