怎么在本地测试 Worker 的 scheduled 定时任务?
我在本地配了 * * * * *,起 wrangler dev --test-scheduled,向一条路由发了个请求,scheduled handler 立刻跑了,收到的 controller.cron 正是我传的表达式。不用等任何一个整点。
所以答案是:本地开发服务器上请求 /cdn-cgi/local/scheduled,用 cron 查询参数模拟不同的 cron 表达式。 新代码和文档里一律用这条官方路径,旧路径只当兼容行为。
这条路由背后是同一个 handler,所以先把 handler 的形状和结束判定弄清楚,再看怎么触发,调试起来更顺。
scheduled handler 长什么样,什么时候结束?
形状和其他 handler 一样,是 (事件, env, ctx):
export default {
async scheduled(controller: ScheduledController, env: Env, ctx: ExecutionContext): Promise<void> {
console.log(controller.cron, new Date(controller.scheduledTime).toISOString());
},
} satisfies ExportedHandler<Env>;官方文档说,运行时会等待它返回的 Promise,最长 15 分钟;第一个失败的 waitUntil 会记为这次 Cron 的状态。waitUntil 本身的语义见 响应返回之后,Worker 里的代码还能继续跑吗。
本地怎么触发它?
官方 scheduled handler 页的脚本化路径,是向本地开发服务器的 /cdn-cgi/local/scheduled 发 HTTP 请求,加 ?format=json 会返回结构化结果。wrangler dev --test-scheduled 的参数说明,也是暴露这条 /cdn-cgi/local/scheduled 路由。该页还介绍了经 Local Explorer 触发。
怎么模拟不同的 cron 表达式?
用 cron 查询参数。我的实测是这样:wrangler 4.151.3,--test-scheduled,配置了 * * * * *,请求 /cdn-cgi/local/scheduled?cron=*+*+*+*+*,返回 ok,handler 收到了这个 cron。
注意表达式里的空格要写成 +(或做 URL 编码)。
旧路径 /cdn-cgi/handler/scheduled 还能用吗?
我试的时候还能用:它也返回 ok,只是不带 cron 参数时,controller.cron 是空字符串。但这是兼容行为,不是文档推荐的路径,别写进新代码和团队文档里。
本地触发成功,线上就一定会按时跑吗?
不能这么推。本地触发只证明 handler 本身在你传的参数下能跑通,不证明线上的 Cron 配置、间隔和 CPU 限额。Cron 的 CPU 限额按间隔分档,数字见 Workers 的 CPU 时间和墙钟时间有什么区别;部署与路由见 部署、版本与回滚。
路由、?format=json、Local Explorer、15 分钟等待上限与waitUntil失败的记录方式来自官方文档,我没有逐项在本地复现。--test-scheduled配合cron参数返回ok、handler 收到该 cron,以及旧路径的行为,是我在 wrangler 4.151.3 上跑过的。行为会变化,以官方文档为准。