Heroku Node.js Scheduler无法运行:10分钟定时任务配置排查求助
我来帮你梳理下可能没配置到位的点,一个个排查就能找到问题:
1. 确保worker.js是合法的Node可执行脚本
你的worker.js开头必须加上shebang行,告诉Heroku用Node.js来执行它:
#!/usr/bin/env node const reports = require('./app/controllers/reports'); reports.sendEmail();
没这行的话,Heroku可能不知道该用什么程序运行这个文件,直接就卡壳了。另外,本地先跑一遍node worker.js,确认不会出现“找不到模块”这类路径错误——毕竟Heroku的文件结构和本地一致,但路径写错的话还是会报错。
2. 检查Scheduler的命令配置
你在Heroku Scheduler里填的命令是不是node worker.js?别只写worker.js,Heroku需要明确知道用Node来执行脚本。另外,还要确认Scheduler用的Node版本和你的项目匹配——看看package.json里的engines字段,比如:
"engines": { "node": "18.x" }
Heroku会自动匹配这个版本,但如果Scheduler用了不同版本,可能会出现依赖兼容问题。
3. 同步邮件服务的环境变量
sendEmail函数肯定依赖SMTP配置这类敏感信息吧?本地你可能存在.env文件里,但Heroku上得用命令把这些变量同步过去:
heroku config:set SMTP_HOST=你的邮件服务器地址 SMTP_PORT=端口 SMTP_USER=邮箱账号 SMTP_PASS=授权码
要是没设置这些环境变量,sendEmail函数根本连不上邮件服务器,自然执行失败。
4. 查看Heroku日志找具体错误
这是最关键的一步!别瞎猜,直接看日志就能知道问题在哪:
heroku logs --ps scheduler
日志里会明确告诉你是模块缺失、环境变量没找到、还是邮件发送时的网络错误——根据日志提示修复就行。
5. 确认项目依赖都在package.json里
本地的node_modules不会被推到Heroku,所以所有依赖(比如nodemailer这类邮件库)都得写在package.json的dependencies里,Heroku部署时才会自动安装。要是漏了依赖,worker.js运行时就会报“找不到模块”的错误。
6. 先在本地验证脚本功能
先在本地运行node worker.js,看能不能成功发邮件。如果本地都失败,那问题出在代码本身,比如sendEmail函数逻辑有问题;如果本地能成功,那肯定是Heroku的配置环节漏了什么。
内容的提问来源于stack exchange,提问作者Rana Umair

