Node路由本地运行正常,部署到Heroku后非根路径请求超时是什么原因?
问题排查与解决步骤
核心原因定位
你只有调用Person.find()的路由超时,根路径不涉及数据库操作可正常返回,直接说明Heroku环境下MongoDB数据库连接异常,请求卡在数据库查询环节,既没有触发成功回调也没有抛出错误返回响应,最终触发Heroku默认30秒请求超时限制。
具体解决步骤
- 检查Heroku环境变量配置
本地开发时你大概率是使用本地MongoDB地址或者在本地.env文件中配置了Mongo连接串,Heroku环境不会读取本地.env文件内容,需要手动进入Heroku控制台对应应用的Settings->Config Vars页面,添加MONGODB_URI变量,值为你的MongoDB服务连接地址(如Mongo Atlas的连接串)。 - 检查MongoDB服务的IP访问限制
如果你使用Mongo Atlas等云数据库服务,默认会开启IP白名单限制,而Heroku的服务器IP是动态不固定的,需要进入Mongo Atlas的网络访问设置页面,添加允许0.0.0.0/0所有IP访问的规则。 - 补充错误捕获逻辑避免无响应
你当前的数据库查询仅编写了.then()成功回调,没有添加.catch()错误处理,一旦查询失败请求就会一直挂起,修改路由代码补充错误处理逻辑:app.get("/info", (req, res) => { Person.find({}) .then((result) => { res.send( `<div> <p>Phonebook has info for ${result.length} people</p> <p>Get request was made at ${new Date()}</p> </div>` ); }) .catch(err => { console.error(err) res.status(500).send('数据库查询失败') }) }); app.get("/api/persons", (req, res) => { Person.find({}) .then((result) => { res.json(result); }) .catch(err => { console.error(err) res.status(500).json({error: '数据库查询失败'}) }) }); - 检查Mongo连接日志确认状态
在应用的MongoDB连接代码处添加连接成功/失败的日志输出,部署后可通过heroku logs --tail命令查看运行日志,确认数据库连接是否正常建立。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

