Express部署到Heroku后带路由参数的GET请求无法访问如何解决?
故障原因
- 最核心的问题是代码执行顺序错误:你当前的代码先调用了
app.listen启动服务,之后才定义路由规则。在Heroku的Node.js生产运行环境下,服务启动后新增的路由不会被正常注册,就会出现部分路由404的问题。根路由能正常访问大概率是巧合,刚好请求进来时根路由已经完成注册,路径更深的接口还没注册完成。 - 次要问题是
express.urlencoded()中间件缺少必填配置,Express 4.16.0之后的版本要求必须显式传入extended参数,否则会触发解析异常,也可能连带影响路由匹配。
解决方法
- 调整代码顺序,把
app.listen放到所有中间件、路由定义的最后面,同时补全urlencoded的配置,修复后代码如下:
var app = express(); app.use(cors()); app.use(express.json()); // 补全extended配置 app.use(express.urlencoded({ extended: true })); const port = process.env.PORT || 3000; // 先定义所有路由 app.get("/", (req, res, next) => { res.send("Hello") }); app.get("/get-checkout/:contract/:nft-id", (req, res, next) => { res.send("checkout") }); // 最后启动服务 app.listen(port, () => console.log("Server running on port:" + port));
- 本地启动服务测试,访问
http://localhost:3000/get-checkout/test/test确认能正常返回checkout后,再重新推送到Heroku部署。 - 如果部署后仍有问题,可以清除Heroku的构建缓存后重新推送,避免旧代码缓存影响。
内容的提问来源于stack exchange,提问作者Ablomis
相关产品推荐
相关产品推荐

