You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自定义包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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:54:53