升级MUI后Mongoose出现MongoNotConnectedError连接报错如何解决?
问题解决方案
核心问题原因
- 升级MUI后前端并行请求量上升,触发了现有Mongoose连接逻辑的竞态问题:多个请求同时发起时,第一个请求尚未完成连接建立,后续请求判断连接未就绪会主动断开正在建立的连接,最终导致会话过期、客户端未连接的报错
- 现有连接逻辑没有做并发锁控制,高并发下会重复创建/销毁连接,耗尽数据库连接资源
- 升级MUI时可能连带升级了其他依赖(如Mongoose、框架版本),原有连接逻辑和新版依赖不兼容
修复步骤
1. 优化Mongoose连接逻辑,添加并发锁控制
替换你现有的连接代码为如下版本:
import mongoose from 'mongoose'; const connection = {}; // 添加全局连接锁,避免并行请求重复触发连接 let connectingPromise = null; async function connect() { if (connection.isConnected === 1) { console.log('already connected'); return; } // 如果正在连接中,直接等待当前连接完成即可 if (connectingPromise) { await connectingPromise; return; } try { if (mongoose.connections.length > 0) { const readyState = mongoose.connections[0].readyState; // 只要不是断开状态就直接复用,不要主动断开现有连接 if (readyState !== 0) { connection.isConnected = readyState; console.log('use previous connection'); return; } // 只有确认连接已经断开的情况下才清理旧连接 await mongoose.disconnect(); } // 赋值连接Promise,后续请求复用 connectingPromise = mongoose.connect(process.env.MONGODB_URI); const db = await connectingPromise; console.log('new connection'); connection.isConnected = db.connections[0].readyState; } catch (err) { // 连接失败重置锁,允许后续重试 connectingPromise = null; throw err; } } async function disconnect() { if (connection.isConnected) { if (process.env.NODE_ENV === 'production') { await mongoose.disconnect(); connection.isConnected = false; connectingPromise = null; } else { console.log('not disconnect in development mode'); } } } function convertDocToObj(doc) { doc._id = doc._id.toString(); doc.createdAt = doc.createdAt.toString(); doc.updatedAt = doc.updatedAt.toString(); return doc; } const db = { connect, disconnect, convertDocToObj }; export default db;
2. 排查前端请求异常
打开浏览器开发者工具的网络面板,触发报错操作后检查:
- 是否存在同一接口重复发起多次请求的情况
- 是否同一时间有超过5个并行的后端接口请求
如果存在上述情况,需要调整MUI组件的配置,关闭不必要的自动数据拉取、防抖处理搜索请求等。
3. 验证依赖兼容性
回滚MUI升级前的package-lock.json/yarn.lock,先确认升级MUI前没有该问题,再单独升级MUI到最新版,不要连带升级其他无关依赖,排除Mongoose、Node框架等依赖版本变动导致的兼容性问题。
内容的提问来源于stack exchange,提问作者eprince_hub
相关产品推荐
相关产品推荐

