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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:24:26