自定义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
相关产品推荐
相关产品推荐

