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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:32:47