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

Next.js中Mongoose连接MongoDB Serverless实例持续报MongoNotConnectedError

问题描述

在Next.js项目中使用Mongoose连接MongoDB Serverless实例时,生产环境持续抛出MongoNotConnectedError: Client must be connected before running operations in Production错误,但使用DigitalOcean托管的MongoDB服务时无此问题。

现有代码

数据库连接工具

import mongoose from "mongoose";

let connection = {};

async function connect() {
  try {
    if (connection.isConnected) {
      console.log('Connected');
      return;
    }
    if (mongoose.connections.length > 0) {
      connection.isConnected = mongoose.connections[0].readyState;
      if (connection.isConnected === 1) {
        console.log("Previous Connection Established");
        return;
      }
      await mongoose.disconnect();
    }
    const db = await mongoose.connect(process.env.MONGODB_URI);
    console.log("New Connection");
    connection.isConnected = db.connections[0].readyState;
  } catch (error) {
    console.error("Error connecting to database:", error);
    process.exit(1);
  }
}

async function disconnect() {
  if (connection.isConnected) {
    if (process.env.NODE_ENV === "production") {
      await mongoose.disconnect();
      connection.isConnected = false;
    } else {
      console.log("Still Connected");
    }
  }
}

const db = { connect, disconnect };
export default db;

getServerSideProps调用代码

export async function getServerSideProps() {
  await db.connect();
  const products = await Product.find().lean();
  await db.disconnect();
  return {
    props: {
      Products: JSON.parse(JSON.stringify(products)),
    },
  };
}
问题原因

MongoDB Serverless实例的连接机制与常规托管MongoDB存在差异,具体触发点如下:

  1. 连接状态缓存失效:Serverless实例会在闲置时自动断开连接,但你的工具中依赖缓存的connection.isConnected判断状态,无法实时感知远端连接断开,导致后续操作使用无效连接。
  2. 错误的连接复用逻辑:当mongoose.connections.length > 0时,直接复用本地缓存的readyState,但该状态未同步远端实际连接状态,此时Serverless连接可能已失效。
  3. 频繁断开重连的副作用:连接前强制执行mongoose.disconnect(),而Serverless实例的连接建立开销更高,频繁断开重连容易引发连接状态不一致。
修复方案

1. 优化连接状态校验逻辑

移除强制断开逻辑,改用Mongoose实时连接状态校验,同时添加Serverless适配配置:

import mongoose from "mongoose";

async function connect() {
  try {
    // 实时校验当前连接状态
    if (mongoose.connection.readyState === 1) {
      console.log('Already connected');
      return;
    }
    // 仅当连接处于半开状态时才断开
    if (mongoose.connection.readyState !== 0) {
      await mongoose.disconnect();
    }
    // 添加Serverless实例适配的连接配置
    await mongoose.connect(process.env.MONGODB_URI, {
      serverSelectionTimeoutMS: 5000,
      socketTimeoutMS: 45000,
      maxPoolSize: 10,
      minPoolSize: 1
    });
    console.log("New connection established");
  } catch (error) {
    console.error("Database connection error:", error);
    process.exit(1);
  }
}

async function disconnect() {
  // 生产环境不再主动断开,交由Mongoose连接池管理
  if (process.env.NODE_ENV === "production") {
    try {
      await mongoose.disconnect();
      console.log("Disconnected from database");
    } catch (err) {
      console.error("Disconnection error:", err);
    }
  } else {
    console.log("Keeping connection open in development");
  }
}

const db = { connect, disconnect };
export default db;

2. 修改getServerSideProps调用逻辑

Serverless实例不建议频繁断开连接,应复用连接池,移除主动断开步骤:

export async function getServerSideProps() {
  await db.connect();
  const products = await Product.find().lean();
  // 移除主动断开逻辑,由连接池管理连接生命周期
  return {
    props: {
      Products: JSON.parse(JSON.stringify(products)),
    },
  };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:09:59