使用自定义包bifrost通过Mongoose连接本地MongoDB遇查询超时错误
Mongoose查询缓冲超时问题排查
错误信息
Private PKG: MongooseError: Operation users.findOne() buffering timed out after 10000ms
问题背景
连接本地MongoDB时触发上述错误,自定义了名为bifrost的包封装MongoDB连接逻辑,直接在项目中使用Mongoose一切正常,但引入bifrost包后就无法正常执行查询。使用版本:mongoose 8.2.4,node 20.10.0。
相关代码
bifrost包中的MongoConnection实现
import {connect, disconnect, ConnectOptions} from 'mongoose'; export class MongoConnection { private config: string; private connectOptions: ConnectOptions; constructor(config: string, connectOptions: ConnectOptions) { this.config = config; this.connectOptions = connectOptions; } public async connect() { console.log('Connecting to Mongo Server ...', this.config); try { return connect(this.config, this.connectOptions); } catch (err) { console.error('Database connection error:', err); throw err; // 记录错误后重新抛出 } } public async close() { try { await disconnect(); console.log('Database connection closed'); } catch (err) { console.error('Error closing MongoDB connection:', err); } } }
示例服务中使用bifrost的代码
import {ConnectOptions, model, Schema} from 'mongoose'; import { MongoConnection } from 'bifrost'; async function connect() { const option: ConnectOptions = { maxPoolSize: 5, connectTimeoutMS: 30000 } const mong = new MongoConnection('url', option); const n = await mong.connect(); console.log(`check connection`, n.connection.readyState) const user = new Schema({ name: String, age: Number }) const User = model('User', user); console.log(`check connection`, n.connection.readyState) return User.findOne({}).exec(); } connect().then(console.log).catch(console.error);
注:实际使用了正确的连接地址,代码中的url为占位符。
问题原因
核心问题是主项目和bifrost包使用了不同的Mongoose实例:
- 如果bifrost包将mongoose列为
dependencies,npm会在包的node_modules中单独安装一份mongoose,导致主项目的mongoose和包内的mongoose是两个独立副本。 - 主项目中创建的模型默认绑定主项目mongoose实例的连接,而bifrost包建立的是另一个mongoose实例的连接,两者不互通,模型找不到可用连接,最终触发查询缓冲超时。
解决方案
1. 调整bifrost包的依赖配置
将mongoose设为peerDependencies,确保主项目和包共享同一个mongoose实例:
修改bifrost包的package.json:
{ "peerDependencies": { "mongoose": "^8.0.0" }, "devDependencies": { "mongoose": "^8.0.0" } }
peerDependencies声明包依赖的宿主环境版本,不会在包内单独安装mongoose。devDependencies仅在开发bifrost包时安装mongoose,用于本地调试。
2. 显式绑定模型与bifrost的连接
如果暂时无法调整依赖,可在创建模型时指定bifrost建立的连接:
// 替换原模型创建代码 const User = model('User', user, 'users', n.connection);
这样模型会使用bifrost包建立的连接执行查询,避免实例不匹配问题。
3. 清理重复依赖
- 在bifrost包目录执行
npm uninstall mongoose,卸载包内的mongoose依赖。 - 在主项目目录执行
npm install,确保项目中只有一份mongoose实例。
内容的提问来源于stack exchange,提问作者SRJ
相关产品推荐
相关产品推荐

