【问题标题】:CloudFlare Worker Cache API Not Storing Fetch ResultsCloudFlare Worker Cache API 不存储获取结果
【发布时间】:2021-11-08 06:38:23
【问题描述】:

我在这个简单的工人身上花了一整天的时间,却一无所获。

我已经关注了 CloudFlare 网站上的 Cache API 示例,还浏览了 StackOverflow 的帖子,但我仍然无处可去。

这篇文章 (Trouble with Cloudflares Worker Cache API) 看起来是我需要的,但它没有帮助。

基本上所有我想要做的就是使用缓存 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 中注销响应 - 什么都没有
  • 将缓存键从响应 obj 更改为 URL(字符串)- 无
  • 直接等待 cache.put - 什么都没有
  • 使用自定义缓存命名空间(所以 await caches.open('pages')) - 没有

基本上,我只是缓存未命中,请求通过我的网络服务器。我可以看到控制台日志,一切运行良好,只是从不缓存或永远找不到缓存。

调试起来非常困难,而且这些方法几乎没有返回任何信息。 cache.put 什么都不返回,cache.match 什么都不返回。他们还不如被嘲笑。

我正在使用 wrangler 构建/发布,那里一切正常。

有人可以帮忙吗?

【问题讨论】:

    标签: javascript cloudflare cloudflare-workers


    【解决方案1】:

    我认为您的代码看起来非常简单/有意义。所以,在我看来,下一个可能性是某种数据问题(例如响应格式)。某些标头,例如 Cache-Control 和特别是 Set-Cookie 会影响它是否可以缓存 - https://developers.cloudflare.com/workers/runtime-apis/cache#headers

    您能否验证您的响应不包含使其无法缓存的内容?如果您能够分享完整的响应,或者只是标题,那也会有所帮助。

    【讨论】:

    • 我还要补充一点,根据您的用例,您可以完全跳过使用缓存 API。 fetch 方法将为您静默处理缓存,如果您在 Cloudflare 中为所请求的 URL 进行了正确设置 - developers.cloudflare.com/workers/learning/…
    • 所以,我认为您在这里有所作为。我认为缓存标头阻止它缓存,因为我在那里看到“私人无缓存”。但是,当我尝试“headers.set”使用公共缓存控件覆盖它们时,我收到错误“无法修改不可变标头”。我不明白,因为我已经按照文档状态修改了响应的克隆。 (iv 用信息更新了原始帖子)
    • 好的,我找到了,你说得对,它与将原始服务器缓存头设置为“无缓存”有关 - 这看起来是 NextJS SSR 呈现页面的标准。非常感谢您的帮助!
    • 阅读您的更新并想到其他一些事情。没有注意到缓存时间设置为只有10秒,很短,你还在用吗?另一件事是,您是否尝试过将处理程序包装在 try / catch 中?注意到这与 CF 的示例不同 - developers.cloudflare.com/workers/examples/cache-api
    • 很高兴你能成功! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2020-10-02
    • 2017-09-08
    • 2017-08-01
    • 1970-01-01
    • 2017-08-14
    • 2011-05-06
    相关资源
    最近更新 更多