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

自定义npm包中Mongoose连接MongoDB出现findOne()缓冲超时求助

Mongoose查询超时问题:封装到npm包后调用users.findOne()报buffering timed out错误

错误信息

MongooseError: Operation `users.findOne()` buffering timed out after 10000ms
    at Timeout.<anonymous> (C:\Users\Lior\Desktop\Work\kbrain-central\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:175:23)
    at listOnTimeout (node:internal/timers:569:17)
    at processTimers (node:internal/timers:512:7)

npm包中的数据库初始化代码

const init = async () => {
  try {
    // 修复DocumentDB中"Retryable writes are not supported"问题
    await mongoose.connect(DB_URL, {
      ssl: SSL_BOOLEAN,
      retryWrites: false,
    });
    const db = mongoose.connection;
    db.on("error", (err) => logger.logError(err));
    db.on("disconnected", () => logger.logError("Lost MongoDB connection"));
    console.log("Connection established successfully")
  } catch (error) {
    throw new DatabaseConnectionError();
  }
};

主应用调用代码

import { init as initDB } from "@phaedra/db";
import { app } from "./app";

async function start() {
  await initDB();
  app.listen(process.env.PORT || 3000, () => {
    console.log("Auth service up");
  });
}

start();

补充说明

将相同代码直接复制到主应用中使用时完全正常;已尝试单独提取连接函数并执行简单查询,问题仍未解决。


问题原因及解决办法

  • Mongoose实例隔离问题:npm包和主应用可能加载了独立的Mongoose实例,导致主应用的模型绑定到未初始化的实例上。
    解决:在npm包中导出Mongoose实例,主应用直接使用该实例定义模型,确保模型与连接复用同一个实例。
    示例:
    npm包新增导出:

    export const mongooseInstance = mongoose;
    

    主应用使用导出的实例:

    import { init as initDB, mongooseInstance } from "@phaedra/db";
    // 用导出的实例定义模型
    const User = mongooseInstance.model('User', userSchema);
    
  • 环境变量传递异常:npm包中的DB_URL、SSL_BOOLEAN等环境变量可能未正确读取主应用的配置,导致连接未实际建立但未抛出错误。
    解决:改为在调用初始化函数时传入连接参数,避免依赖环境变量的跨包读取:
    npm包修改init函数:

    const init = async (dbUrl, ssl) => {
      try {
        await mongoose.connect(dbUrl, {
          ssl: ssl,
          retryWrites: false,
        });
        // 其余连接监听代码不变
      } catch (error) {
        throw new DatabaseConnectionError();
      }
    };
    

    主应用调用时传参:

    await initDB(process.env.DB_URL, process.env.SSL_BOOLEAN === 'true');
    
  • 连接状态未完全就绪:虽然用了await mongoose.connect(),但Mongoose内部状态可能未完全同步,导致后续查询时连接仍未就绪。
    解决:通过connected事件确认连接完成后再resolve初始化Promise:
    npm包修改init函数:

    const init = async () => {
      return new Promise((resolve, reject) => {
        try {
          mongoose.connect(DB_URL, {
            ssl: SSL_BOOLEAN,
            retryWrites: false,
          });
          const db = mongoose.connection;
          db.on("error", (err) => {
            logger.logError(err);
            reject(err);
          });
          db.on("disconnected", () => logger.logError("Lost MongoDB connection"));
          db.on("connected", () => {
            console.log("Connection established successfully");
            resolve();
          });
        } catch (error) {
          reject(new DatabaseConnectionError());
        }
      });
    };
    

内容的提问来源于stack exchange,提问作者Lior Shein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:05:02