You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}`);
});

最后部署验证步骤

  1. 提交所有修改到Git仓库:
git add .
git commit -m "Fix Heroku deployment issues: add start script, dynamic port, request body parsing"
  1. 推送到Heroku:
git push heroku main
  1. 查看日志确认启动状态:
heroku logs --tail

如果看到Server running on port XXXXX(XXXXX为Heroku分配的端口),说明应用已成功启动,此时访问你的Heroku应用即可正常使用。

内容的提问来源于stack exchange,提问作者Youness Houdass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:42:39