Heroku部署Node.js Express MongoDB应用报H12请求超时错误如何解决?
问题修复方案
以下是你代码中导致H12超时错误的核心问题及修复方法:
- Mongoose未导入且数据库连接函数未执行
你代码中导入mongoose的语句被注释,同时定义的connectDB异步函数从未被调用,导致应用启动后没有连接MongoDB。首页请求到达时,homeController需要查询数据库数据,请求一直挂起直到超过Heroku的30秒超时阈值,触发H12错误。
修复操作:取消const mongoose = require('mongoose')语句的注释,在connectDB函数定义完成后新增一行connectDB()调用函数。 - 全局登录状态中间件配置错误
首先你将全局登录状态赋值的中间件放在了所有路由定义之后,请求匹配到路由时该中间件还未执行;其次访问session的写法错误,正确的session属性挂载在req.session下而非req.expressSession。
修复操作:将该中间件移到expressSession配置代码之后、所有路由定义之前,同时将loggedIn = req.expressSession.userId;修改为loggedIn = req.session.userId;。 - express-fileupload中间件用法错误
你写的app.use(fileUpload);没有调用中间件构造函数,正确用法为app.use(fileUpload());,未执行调用会导致涉及文件上传的请求逻辑卡住。 - 单篇文章路由定义错误
路由app.get('/post:id', getPostController)缺少路径分隔符,无法匹配单篇文章的访问路径,正确写法为app.get('/post/:id', getPostController)。 - express-session生产环境配置缺失
你当前的express-session配置使用默认内存存储,生产环境下内存存储容量有限、多实例同步异常,且未配置resave、saveUninitialized参数会抛出警告。建议补充配置:将session密钥存入Heroku的config vars,修改session配置为:app.use(expressSession({ secret: process.env.SESSION_SECRET || 'keyboard cat', resave: false, saveUninitialized: false }))
内容的提问来源于stack exchange,提问作者Candis W
相关产品推荐
相关产品推荐

