如何解决Heroku部署Express服务器时的503/H10应用崩溃错误?
问题描述
将Express服务器部署到Heroku后无法正常启动,错误日志如下:
2023-02-06T09:34:31.419072+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2023-02-06T09:34:31.419234+00:00 app[web.1]: npm ERR! errno 1
2023-02-06T09:34:31.419978+00:00 app[web.1]: npm ERR! server@1.0.0 start:node server.js
2023-02-06T09:34:31.420062+00:00 app[web.1]: npm ERR! Exit status 1
2023-02-06T09:34:31.420152+00:00 app[web.1]: npm ERR!
2023-02-06T09:34:31.420229+00:00 app[web.1]: npm ERR! Failed at the server@1.0.0 start script.
2023-02-06T09:34:31.420301+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2023-02-06T09:34:31.428635+00:00 app[web.1]:
2023-02-06T09:34:31.428714+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2023-02-06T09:34:31.428770+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2023-02-06T09_34_31_420Z-debug.log
2023-02-06T09:34:31.607388+00:00 heroku[web.1]: Process exited with status 1
2023-02-06T09:34:31.670514+00:00 heroku[web.1]: State changed from starting to crashed
2023-02-06T09:34:57.360088+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=thewrightlogistic.herokuapp.com request_id=45a256da-ca0f-4af1-86a6-a7fc81112803 fwd="98.174.153.51" dyno= connect= service= status=503 bytes= protocol=https
2023-02-06T09:34:57.360088+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=thewrightlogistic.herokuapp.com request_id=45a256da-ca0f-4af1-86a6-a7fc81112803 fwd="98.174.153.51" dyno= connect= service= status=503 bytes= protocol=https
服务器代码:
const express = require('express'); const path = require('path'); const bodyParser = require('body-parser') const mongoose = require('./database') const middleware = require('./middleware') const cors = require('cors') const app = express(); const contactRouter = require('./routes/contactRoutes'); const authRouter = require('./routes/authRoutes'); const userRouter = require('./routes/userRoutes'); // const dashboardRouter = require('./routes/dashboard'); // view engine setup app.set('view engine', 'ejs' ); // STATIC FILES app.use(express.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static('public')); app.use(cors()) // post contact route app.use('/auth',authRouter ); app.use('/users',userRouter ); app.use('/contact',contactRouter ); // app.use('/dashboard',dashboardRouter ); // FOR PRODUCTION app.listen(process.env.PORT || 8080, () => { console.log(`Listening on port 8080`) })
排查与解决步骤
获取完整错误日志
日志提示存在更详细的报错信息,通过Heroku CLI执行heroku logs --tail查看完整启动日志,重点关注npm ERR!之前的内容,这通常是具体的代码错误(比如依赖缺失、文件路径错误、数据库连接失败等)。检查package.json配置
确认package.json中的start脚本为node server.js,且server.js是项目入口文件、路径正确。同时检查dependencies是否包含所有生产环境必需的依赖(如express、ejs、mongoose等),避免将核心依赖放在devDependencies导致部署时未安装。验证数据库连接
代码中引入了./database模块,需确认Heroku环境下是否正确配置了数据库环境变量,连接字符串是否有效。检查数据库模块是否处理了连接失败的异常,避免因未捕获的错误导致进程直接退出。端口配置确认
当前代码使用process.env.PORT || 8080的配置是正确的,无需手动指定固定端口,确保没有其他代码硬编码端口覆盖此配置。依赖兼容性排查
检查依赖版本与Node.js版本是否兼容,比如mongoose的版本是否支持Heroku提供的Node.js环境。可以在本地执行npm run start模拟生产环境启动,复现并排查本地能运行但部署后失败的问题。静态文件与视图引擎检查
确认public目录存在且路径正确,ejs已安装在生产依赖中。若视图文件路径错误,也可能导致启动失败。
内容的提问来源于stack exchange,提问作者Bojurie

