Express.js REST API在Heroku上无法运行的技术求助
问题排查与解决方案
我帮你梳理了Heroku部署Node.js应用时的几个关键问题,你的代码和配置里刚好缺失了这些必要设置,导致部署后无法正常运行:
1. 缺少启动脚本(Start Script)
Heroku需要明确知道如何启动你的应用,而你的package.json里没有定义start脚本,同时main字段指向的index.js也不是你的实际入口文件app.js。
修改后的package.json:
{ "name": "express-rest-youness", "version": "1.0.0", "main": "app.js", "scripts": { "start": "node app.js", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "", "dependencies": { "express": "^4.16.2", "express-rest": "^1.0.4" } }
2. 硬编码端口号
Heroku会为每个应用分配动态端口,通过环境变量PORT提供,你直接写死8080会导致Heroku无法正确映射外部访问端口。
修改app.js的监听代码:
将app.listen(8080);替换为:
const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`Server running on port ${port}`); });
这样本地开发时用8080,Heroku部署时自动使用分配的端口。
3. 未解析请求体(POST/PUT请求会失败)
你的app.js没有添加JSON请求体解析中间件,处理PUT和POST请求时req.body会是undefined,进而引发逻辑错误导致应用崩溃。
在app.js开头添加中间件:
在var app = express();之后插入:
app.use(express.json()); // 如需处理表单编码的请求,可额外添加 app.use(express.urlencoded({ extended: true }));
修改后的完整app.js代码
var express = require('express'), expressRest = require('express-rest'); var app = express(); // 添加请求体解析中间件 app.use(express.json()); app.use(express.urlencoded({ extended: true })); var rest = expressRest(app); var records = [ {value: 'Apple'}, {value: 'Banana'} ]; rest.get('/api/food', function(req, rest) { rest.ok(records); }); rest.get('/api/food/:id', function(req, rest) { var record = records[req.params.id]; if (record) rest.ok(record); else rest.notFound(); }); rest.put('/api/food/:id', function(req, rest) { records[req.params.id] = req.body; return rest.accepted('/api/food/' + encodeURI(req.params.id)); }); rest.post('/api/food', function(req, rest) { records.push(req.body); rest.created('/api/food/' + (records.length - 1)); }); rest.delete('/api/food/:id', function(req, rest) { delete records[req.params.id]; rest.gone(); }); // 使用动态端口 const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`Server running on port ${port}`); });
最后部署验证步骤
- 提交所有修改到Git仓库:
git add . git commit -m "Fix Heroku deployment issues: add start script, dynamic port, request body parsing"
- 推送到Heroku:
git push heroku main
- 查看日志确认启动状态:
heroku logs --tail
如果看到Server running on port XXXXX(XXXXX为Heroku分配的端口),说明应用已成功启动,此时访问你的Heroku应用即可正常使用。
内容的提问来源于stack exchange,提问作者Youness Houdass
相关产品推荐
相关产品推荐

