Node.js联系页后端部署Heroku遇H10崩溃及模块缺失问题求助
让我们一步步拆解你遇到的问题,从日志里的关键信息入手:
1. 核心问题1:模块找不到 @sendGrid/mail
看日志里的明确报错:
Error: Cannot find module '@sendGrid/mail'
这是大小写敏感导致的坑!你本地用的是Windows系统,它对文件名/包名不区分大小写,所以本地运行没问题,但Heroku跑在Linux环境下,严格区分大小写。而实际npm包的正确名称是@sendgrid/mail(sendgrid里的g是小写),但你代码里写的是@sendGrid/mail(大写G),自然找不到模块。
修复方法:
修改App.js里的引入语句:
// 原代码 const sendGrid = require('@sendGrid/mail'); // 改为(注意g小写) const sendGrid = require('@sendgrid/mail');
2. 核心问题2:Heroku错误启动index.js而非你的App.js
日志第一行就暴露了问题:
2020-08-30T14:49:33.088197+00:00 heroku[web.1]: Starting process with command
node index.js
但你的主文件是App.js,说明Heroku没正确识别到你的启动入口。
修复方法:
- 确认你的
Procfile(首字母必须大写)内容是web: node App.js,并且已经提交到Git仓库(执行git add Procfile && git commit -m "Add Procfile")。 - 检查你的
package.json里的main字段是"App.js"、start脚本是"node App.js"——你当前的package.json配置是对的,但要确保这些修改已经推送到Heroku(执行git push heroku main)。 - 核实你的主文件名确实是
App.js(大小写完全匹配),没有误写成app.js或index.js。
3. 其他需要确认的配置
关于process.env.PORT
你已经改成app.listen(process.env.PORT || 4000);,这个设置完全正确!Heroku会动态分配端口,必须用process.env.PORT获取,本地运行时会自动 fallback到4000,无需调整。
SendGrid API密钥环境变量
你的代码里用了sendGrid.setApiKey(process.env.SENDGRID_API_KEY);,但Heroku不会自动同步本地环境变量,需要手动设置:
- 通过Heroku CLI设置:运行
heroku config:set SENDGRID_API_KEY=你的SendGrid密钥 - 或者在Heroku Dashboard的应用「Settings」页面,找到「Config Vars」添加该变量。
最后部署验证
修改完成后,重新提交并部署:
git add . git commit -m "Fix module case and start script" git push heroku main
部署完成后,运行heroku logs --tail查看实时日志,确认无报错后,访问你的/api路径测试服务是否正常运行。
内容的提问来源于stack exchange,提问作者Daniel Zhang

