Heroku部署Node.js应用遇Error R10超时问题求助
Heroku部署Express+Apollo应用问题解决方案
1. 替换启动命令,移除nodemon
Heroku是生产环境,nodemon是开发用的热重载工具,在生产环境运行会直接触发clean exit。修改package.json的启动命令:
"scripts": { "start": "node index.js", "dev": "nodemon index.js" // 保留该命令用于本地开发即可 }
2. 正确绑定Heroku分配的端口
必须通过process.env.PORT获取Heroku动态分配的端口,不能硬编码固定端口。结合Apollo Server的正确写法如下:
const PORT = process.env.PORT || 4000; const app = express(); const server = new ApolloServer({ typeDefs, resolvers }); async function bootServer() { // 必须等待Apollo Server启动完成后再绑定端口 await server.start(); server.applyMiddleware({ app }); app.listen(PORT, () => { console.log(`Server running on port ${PORT}, GraphQL path: ${server.graphqlPath}`); }); } bootServer();
重点:一定要等server.start()执行完毕再监听端口,否则启动延迟会触发R10超时错误。
3. 检查Procfile配置
如果使用Procfile,内容需准确无误,且不能带后缀(如不能命名为Procfile.txt),放在项目根目录:
web: node index.js
4. 排查clean exit的具体原因
若修改后仍出现崩溃,拉取Heroku详细日志定位问题:
heroku logs --tail
通常clean exit是因为未捕获的代码错误(如依赖缺失、环境变量未配置),可在index.js开头添加错误捕获逻辑:
process.on('uncaughtException', err => { console.error('未捕获异常:', err); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', promise, '原因:', reason); process.exit(1); });
5. 重新部署应用
修改完成后提交代码并重新部署:
git add . git commit -m "修复生产环境启动配置" git push heroku main
内容的提问来源于stack exchange,提问作者Tylor tian
相关产品推荐
相关产品推荐

