NextJS 14 App Router Mongoose报MongoNotConnectedError求解决
解决MongoNotConnectedError的方案
问题根源
你这段代码的核心问题是每次调用函数都重复执行mongoose.connect()和mongoose.disconnect():
- Mongoose的数据库连接是单例模式,重复调用连接会导致连接状态混乱,并发场景下极易出现“未连接就执行操作”的错误。
finally块里的disconnect会在操作完成后立即断开连接,后续请求需要重新建立连接,既降低效率,又容易因连接未就绪触发异常。
解决方案
1. 全局初始化数据库连接
在应用启动的入口文件(如app.ts、server.ts)中只执行一次连接操作,整个应用生命周期复用该连接,无需每次操作后断开:
// 应用入口文件 import mongoose from 'mongoose'; const databaseUri: string = process.env.DATABASE_URI as string; async function initDatabase() { try { await mongoose.connect(databaseUri); console.log('数据库连接成功'); } catch (error) { console.error('数据库连接失败:', error); process.exit(1); // 连接失败时终止应用,避免后续错误 } } // 启动时初始化连接 initDatabase();
2. 改造DeleteProductBySlug函数
移除函数内部的连接、断开逻辑,直接复用全局已建立的连接:
export async function DeleteProductBySlug({ slug, storeId }: any) { try { const StoreProduct: any = await ProductsModel.findOneAndUpdate( { storeId: storeId }, { $pull: { products: { slug: slug } } }, { new: true } ); if (StoreProduct) { revalidatePath(`/${storeId}/product/allproducts`); return true; } console.log("server"); } catch (error) { console.log("DELETE", error); return false; } }
3. 额外优化建议
- 替换
any类型,定义明确的TypeScript接口约束参数和返回值,提升代码可维护性。 - 若需特殊场景下的连接检查,可在函数开头添加:
if (mongoose.connection.readyState !== 1) { throw new Error('数据库未就绪,请检查连接状态'); }
内容的提问来源于stack exchange,提问作者Asad Fakhar
相关产品推荐
相关产品推荐

