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
) 对客户端超时,但不会
- 运行 本地(例如通过使用 cfworker,一个在本地模拟 cloudflare workers 的好工具)
- 或 运行 预览 (
wrangler preview --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 。它什么都不做。
我发布的 Cloudflare Worker (wrangler publish --env environment_name
) 对客户端超时,但不会
- 运行 本地(例如通过使用 cfworker,一个在本地模拟 cloudflare workers 的好工具)
- 或 运行 预览 (
wrangler preview --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 。它什么都不做。