CloudFlare Worker Cache API 不存储获取结果
CloudFlare Worker Cache API Not Storing Fetch Results
我刚刚在这个简单的 worker 上花了一整天,却一无所获。
我关注了 CloudFlare 网站上的 Cache API 示例,还浏览了 Whosebug postings,但我仍然一无所获。
这个 post () 看起来像是我需要的,但它没有帮助。
基本上我所做的就是使用缓存 API 将某些页面缓存一段时间。我最终需要为每个国家代码做特定的缓存(这就是为什么我使用工作人员而不是页面规则)但是现在我试图做的就是让基本缓存 API 作为测试工作。
这是代码,与他们网站上的示例代码基本相同
handler.ts
export async function handleRequest(event: FetchEvent): Promise<Response> {
const { request } = event
const cacheUrl = new URL(request.url)
const cacheKey = new Request(cacheUrl.toString(), request)
const cache = caches.default
let response = await cache.match(cacheKey)
if (!response) {
console.log('NO CACHE MATCH')
// If not in cache, get it from origin
response = await fetch(request)
// Must use Response constructor to inherit all of response's fields
response = new Response(response.body, response)
response.headers.append('Cache-Control', 's-maxage=10')
event.waitUntil(cache.put(cacheKey, response.clone()))
}
return response
}
index.ts
import { handleRequest } from './handler'
addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event))
})
我知道您不能在 workers.dev 域中使用缓存 API,因此我已将 worker 部署到自定义域,因此它应该可以访问 API。
我试过了
- 正在注销来自 cache.put 的响应 - 什么都没有
- 将缓存键从响应对象更改为 URL(字符串)- 无
- 直接等待 cache.put - 没什么
- 使用自定义缓存命名空间(所以 await caches.open('pages'))- 没什么
基本上,我只是遇到缓存未命中并且请求通过我的网络服务器。我可以看到控制台日志,一切正常 运行,只是从不缓存或从未找到缓存。
调试起来非常困难,而且这些方法几乎没有返回任何信息。 cache.put returns 没什么,cache.match returns 没什么。他们还不如被嘲笑。
我正在使用 wrangler 构建/发布,一切正常。
有人可以帮忙吗?
我认为您的代码看起来非常简单/有道理。所以,对我来说,下一个可能性似乎是某种数据问题(例如响应格式)。一些 headers,比如 Cache-Control
,特别是 Set-Cookie
会影响它是否可以被缓存 - https://developers.cloudflare.com/workers/runtime-apis/cache#headers
您能否确认您的响应不包含使其无法缓存的内容?如果您能够分享完整的回复,或者只是 headers,那也会有所帮助。
我刚刚在这个简单的 worker 上花了一整天,却一无所获。
我关注了 CloudFlare 网站上的 Cache API 示例,还浏览了 Whosebug postings,但我仍然一无所获。
这个 post (
基本上我所做的就是使用缓存 API 将某些页面缓存一段时间。我最终需要为每个国家代码做特定的缓存(这就是为什么我使用工作人员而不是页面规则)但是现在我试图做的就是让基本缓存 API 作为测试工作。
这是代码,与他们网站上的示例代码基本相同
handler.ts
export async function handleRequest(event: FetchEvent): Promise<Response> {
const { request } = event
const cacheUrl = new URL(request.url)
const cacheKey = new Request(cacheUrl.toString(), request)
const cache = caches.default
let response = await cache.match(cacheKey)
if (!response) {
console.log('NO CACHE MATCH')
// If not in cache, get it from origin
response = await fetch(request)
// Must use Response constructor to inherit all of response's fields
response = new Response(response.body, response)
response.headers.append('Cache-Control', 's-maxage=10')
event.waitUntil(cache.put(cacheKey, response.clone()))
}
return response
}
index.ts
import { handleRequest } from './handler'
addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event))
})
我知道您不能在 workers.dev 域中使用缓存 API,因此我已将 worker 部署到自定义域,因此它应该可以访问 API。
我试过了
- 正在注销来自 cache.put 的响应 - 什么都没有
- 将缓存键从响应对象更改为 URL(字符串)- 无
- 直接等待 cache.put - 没什么
- 使用自定义缓存命名空间(所以 await caches.open('pages'))- 没什么
基本上,我只是遇到缓存未命中并且请求通过我的网络服务器。我可以看到控制台日志,一切正常 运行,只是从不缓存或从未找到缓存。
调试起来非常困难,而且这些方法几乎没有返回任何信息。 cache.put returns 没什么,cache.match returns 没什么。他们还不如被嘲笑。
我正在使用 wrangler 构建/发布,一切正常。
有人可以帮忙吗?
我认为您的代码看起来非常简单/有道理。所以,对我来说,下一个可能性似乎是某种数据问题(例如响应格式)。一些 headers,比如 Cache-Control
,特别是 Set-Cookie
会影响它是否可以被缓存 - https://developers.cloudflare.com/workers/runtime-apis/cache#headers
您能否确认您的响应不包含使其无法缓存的内容?如果您能够分享完整的回复,或者只是 headers,那也会有所帮助。