在Heroku部署Next.js与Express.js应用持续报错求助
解决Express + Next.js部署Heroku的H10崩溃问题
我要把Express.js和Next.js搭建的项目部署到Heroku,打算通过package.json里的heroku-postbuild脚本在部署时生成静态文件。试了很久都没成功,参考过React项目的部署教程,但不确定适不适合Next.js;手动执行前端构建脚本再部署也没用。应用部署成功了,但打开Heroku页面时显示应用错误,日志里报:
at=error code=H10 desc="App crashed" method=GET path="/" host=naira-only.herokuapp.com request_id=a92f9b80-ba50-4fa2-a1fa-9aa009f16232 fwd="102.89.32.125" dyno= connect= service= status=503 bytes= protocol=https
现有代码
server.js
const dbConnect = require("./src/lib/dbConnect.js"); const express = require("express"); const rootRoute = require("./src/root_Route"); const cookieParser = require("cookie-parser"); const cors = require("cors"); const dotenv = require("dotenv"); const path = require("path"); dotenv.config(); dbConnect(); const app = express(); app.set("trust proxy", 1); app.use(express.json()); app.use(cookieParser()); app.use( cors({ origin: ["http://localhost:3000"], credentials: true, methods: ["GET", "POST", "PUT", "DELETE"], }) ); rootRoute(app); // Serve static assets if in production if (process.env.NODE_ENV === "production") { app.use(express.static("frontend/out")); app.get("*", (req, res) => { res.sendFile(path.resolve(__dirname, "frontend", "out", "index.html")); }); } const PORT = process.env.PORT || 5000; app.listen(PORT, (req, res) => console.log(`Server running on PORT:${5000}`));
package.json 脚本部分
"scripts": { "start": "node server", "push-to-live": "git push heroku master", "server": "nodemon server", "client": "cd ./frontend && yarn dev", "dev": "concurrently \"yarn server\" \"yarn client\"", "heroku-postbuild": "NPM__CONFIG_PRODUCTION=false cd ./frontend && yarn && yarn build " }
问题排查与修复方案
1. 修正Heroku构建命令
NPM__CONFIG_PRODUCTION=false是npm的写法,用yarn需改成YARN_PRODUCTION=false,否则Heroku会跳过dev依赖安装,导致Next.js构建失败。- 调整构建命令确保路径切换生效:
"heroku-postbuild": "cd ./frontend && YARN_PRODUCTION=false yarn install && yarn build"
2. 确认Next.js静态导出配置
Next.js默认不会生成out目录,需在frontend/next.config.js中添加静态导出配置:
// frontend/next.config.js /** @type {import('next').NextConfig} */ const nextConfig = { output: 'export', // 其他项目配置 } module.exports = nextConfig;
3. 修复生产环境CORS配置
当前CORS仅允许本地域名,生产环境需添加Heroku域名:
const allowedOrigins = process.env.NODE_ENV === 'production' ? ["https://naira-only.herokuapp.com"] : ["http://localhost:3000"]; app.use( cors({ origin: allowedOrigins, credentials: true, methods: ["GET", "POST", "PUT", "DELETE"], }) );
4. 修正服务器端口日志
日志里写死了端口号,需改为动态分配的PORT变量:
app.listen(PORT, () => console.log(`Server running on PORT:${PORT}`));
5. 查看详细崩溃日志
H10是通用崩溃提示,需查看具体报错信息:
heroku logs --tail
重点排查模块缺失、数据库连接失败、环境变量未配置等问题。
内容的提问来源于stack exchange,提问作者Paulliano
相关产品推荐
相关产品推荐

