Vercel|创建 cron jobs 定时任务

设置定时任务之后,Vercel 会定时向指定端点发送 HTTP 请求,从而完成一些自动化工作。

关于 Vercel Cron Jobs 的几个关键点:

  • 只能通过 vercel.json 配置,不支持 Web 端配置。
  • 只对生产环境生效。
  • 只支持 GET 方法。

vercel.json 时间配置

Managing Cron Jobs
Learn how to manage Cron Jobs effectively in Vercel. Explore cron job duration, error handling, deployments, concurrency control, local execution, and more to optimize your serverless workflows.

添加 Authorization 保护

通过在 Vercel 项目中添加名为 CRON_SECRET 的环境变量,可实现对 cron 任务调用的安全保护。

只要在 Vercel 项目中设置了 CRON_SECRET 环境变量,Vercel Cron 会自动在每次请求中包含:Authorization: Bearer {CRON_SECRET}

我们需要在端点中手动添加对 Authorization 的验证代码:

详情参见官方说明:https://vercel.com/docs/cron-jobs/manage-cron-jobs?framework=nextjs

常见问题

定时任务不触发

定时任务未按预期触发,在 Log 中看不到任何访问记录。即使手动点击 Run 也没有执行记录。

  1. 是否和部署方式 有关系?

尝试在 IDE 本地使用 Vercel Cli 工具进行编译,如果有错误先解决错误。

vercel build --prod

然后,尝试使用 vercel cli 部署。

vercel deploy // 部署到 Preview,然后在 Dashboard 手动推送到生产环境。

问题仍然存在,仍然没有访问记录。

  1. 是否和域名有关系?

Vercel 项目会默认创建一个域名,例如:autoused-backend.vercel.app

我之前删除了这个配置,更新为了我自己的域名。现在我怀疑是否是这个域名不生效,导致 cron 无法执行?但是当我想主动在 Domain 中添加这个域名,又会提示我已经绑定,但是访问这个域名确实未绑定(这里可能是一个 BUG)。因此,陷入了死循环无法测试。

我只能尝试删除 vercel 项目,然后重新部署试试。

  1. 尝试删除 Vercel 项目,重新创建?

重新创建 vercel 项目之后,问题仍然存在。


最后发现是环境变量的问题。

原因是使用 AI 通过 vercel cli 配置的环境变量,自动为每个环境变量添加了一个【空格】。在 Dashboard 上没有报错,只有编辑环境变量的时候才有提示。

建议手动设置环境变量,cli 命令可能会添加格外的换行符,导致环境变量不匹配导致问题!至少需要手动检查一下。