Cloudflare Worker 客户端超时,但所有工作都已完成并且没有给出超时错误(使用 console.log/ `wrangler tail` 检查)

Cloudflare Worker times out for the client, but all the work completes and no timeout error given (inspected with console.log/ `wrangler tail`)

我发布的 Cloudflare Worker (wrangler publish --env environment_name) 对客户端超时,但不会

我的工人总结:

addEventListener('fetch', async (event) => {
  const fetchEvent = event as FetchEvent
  const results = await doSomeWork() // returns a promise
  return fetchEvent.respondWith(new Response(JSON.stringify(results)))
})

我的 wrangler tail(生产日志)输出完成(在我将 console.log 语句放入 doSomeWork 之后)。没有错误,我在 wrangler tail。如果超时发生,我本来希望得到 error code 1102(工人超过 CPU 时间限制。)。

事实证明 addEventListener 无法传递 async 函数(或 return 是一个承诺的函数)。然而 fetchEvent.respondWith 确实接受了一个承诺。这没有写在文档中,但我在 lib.webworker.d.ts.

中发现了这一点

要进行异步工作,您必须 return 对 fetchEvent.respondWith 的承诺:

所以你的替代方案是:

  • respondWith
  • 传递承诺
addEventListener('fetch' (event) => {
  const fetchEvent = event as FetchEvent
  const responsePromise = doSomeWork().then((results) => new Response(JSON.stringify(results))
  return fetchEvent.respondWith(responsePromise))
})
  • 或者把一个async函数的结果传给respondWith(还是promise,我跟你说了,一定要return一个promise)
addEventListener('fetch' (event) => {
  const fetchEvent = event as FetchEvent
  const responsePromise = 
  return fetchEvent.respondWith(async () => {
    // I would put this async function in a different file (handlers.ts/.js), and name it `doSomeWorkHandler` to make it more readable though
    const results = await doSomeWork()
    return new Response(JSON.stringify({hello: "world"}))
  }))
})

为什么没有超时错误?

没有发生超时错误的原因是,即使 Cloudflare Workers 在免费计划中将您的 CPU 执行时间限制为 10 毫秒,它也不会停止您的 worker 因为你没有在这个错误/边缘案例中使用 CPU 。它什么都不做。