NodeJS MongoDB中findById()启动和POST正常,单独执行文件超时如何解决?
核心原因
你单独执行node ./routes/qbo1.js时程序没有执行MongoDB连接逻辑:
- 正常启动服务时,执行顺序是先运行
server.js,调用mongoose.connect()完成数据库连接后,才会加载qbo1路由模块,此时数据库连接已就绪,所以启动时的find函数和接口内的查询都能正常执行。 - 单独运行
qbo1.js时,server.js内的数据库连接代码完全不会执行,Mongoose没有建立和MongoDB的连接,所有数据库操作都会进入缓冲队列,超过10秒后就触发了你遇到的超时错误。
解决方案
方案1:给单独运行的qbo1.js补充数据库连接逻辑
修改./routes/qbo1.js调整为如下可单独运行版本即可,注意确保运行时能正确读取到process.env.MONGODB_URI环境变量:
const express = require('express'); const router = express.Router() const mongoose = require('mongoose') const RefreshToken = require('../models/refreshtoken.js'); // 补充数据库连接逻辑 mongoose.connect(process.env.MONGODB_URI, {useNewUrlParser: true, useUnifiedTopology: true}) const db = mongoose.connection db.on('error', (error) => console.error(error)) // 连接成功后再执行查询 db.once('open', async () => { console.log('Connected to Database') await find() // 查询完成后断开连接,避免进程挂起 await mongoose.disconnect() }) async function find() { const token = await RefreshToken.findById('61355917fedd0f00166e4e08') console.log(token) } module.exports = router
方案2:抽离公共逻辑适配多场景使用
如果需要在路由、定时任务等多个场景复用获取token的逻辑,建议把数据库操作抽成独立工具方法:
- 新建
./utils/getRefreshToken.js:
const RefreshToken = require('../models/refreshtoken.js') module.exports = async function getRefreshToken() { return await RefreshToken.findById('61355917fedd0f00166e4e08') }
- 路由中直接引入使用即可,定时任务脚本单独实现数据库连接逻辑后,引入该工具方法调用即可。
方案3:服务内集成定时任务
如果定时任务和现有服务同部署的话,直接在server.js中引入node-schedule之类的定时任务库,在服务进程内运行定时任务,直接复用现有数据库连接,无需额外处理连接逻辑。
内容的提问来源于stack exchange,提问作者JBW
相关产品推荐
相关产品推荐

