How to fix 'Uncaught (in promise) TypeError: Cannot read property 'method' of undefined' in Cloudflare worker?

How to fix 'Uncaught (in promise) TypeError: Cannot read property 'method' of undefined' in Cloudflare worker?

我正在尝试缓存将由 React Google 地图中的 KML 层调用的图像,以便减少显示图像的延迟并减少使用 Cloudflare Worker 大规模调用 AWS S3。

我已遵循可通过此 link 找到的 Cloudflare 教程:https://workers.cloudflare.com/docs/tutorials/configure-your-cdn/

Cloudflare worker 项目已编译成脚本,控制台提示以下错误。 未捕获(承诺)TypeError:无法读取未定义的 属性 'method' 未捕获(响应)类型错误:无法读取未定义的 属性 'method'

我已经检查了 Cloudflare 生成的脚本的缩小文件,但我无法弄清楚出了什么问题,尽管我努力按照教程进行操作。

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

const BUCKET_NAME = 'nightskybrightness'
const BUCKET_URL = `https://${BUCKET_NAME}.s3.eu-west-3.amazonaws.com`


async function serveAsset(event) {
  const url = new URL(event.request.url)
  const cache = caches.default
  let response = await cache.match(event.request)

  if (!response) {
    response = await fetch(`${BUCKET_URL}${url.pathname}`)
    const headers = { 'cache-control': 'public, max-age=15638400' }
    response = new Response(response.body, { ...response, headers })
    event.waitUntil(cache.put(event.request, response.clone()))
  }
  return response

}


async function handleRequest(event) {
  if (event.request.method === 'GET') {
    let response = await serveAsset(event)
    if (response.status > 399) {
      response = new Response(response.statusText, { status: response.status })
    }
    return response
  } else {
    return new Response('Method not allowed', { status: 405 })
  }
}

预期结果:Cloudflare 会将图像缓存在其 CDN 上,并在最终用户调用时提供它们,从而减少延迟并减少对 AWS S3 的调用。 network/headers 部分中的 cf-cache-status 应指示 HIT 或 MISS。缓存的图像将由 KML 层定位在用户浏览器中的 Google 地图之上。

实际结果:Cloudflare 工作脚本抛出错误,因此没有按预期进行图像缓存。 network/headers 部分中的 cf-cache-status 甚至没有出现在 Response Headers 部分中。

问题是在这一行:

  event.respondWith(handleRequest(event.request))

您正在将 event.request 作为参数传递给 handleRequest()。但是在这条线上:

async function handleRequest(event) {

handleRequest() 被定义为只取 event,而不是 event.request。所以在这条线上:

  if (event.request.method === 'GET') {

您实际上正在访问 event.request.request.method。但是 event.request.requestundefined,因此您在尝试访问 undefined.method.

时会遇到异常

我建议将 event.respondWith 行更改为:

  event.respondWith(handleRequest(event))

这是您链接到的示例代码中的样子。

我认为问题的根源在于 CloudFlare 的 Worker Editor Preview 实施。我在 Udacity 的代码 "chore" issue 中找到了线索。

其中 mentions ...

  • WARNING: Request Attributes do not currently work in the Worker Editor
  • Preview, resulting in an error: "Uncaught (in response) TypeError: Cannot read property 'country' of undefined."

所以,只是预览中的错误。 “保存并部署”并在真实浏览器中测试 *.worker.dev URL 是否有效。