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

Next.js中mongoose.connect报错:TypeError: connect不是函数

问题分析与解决方案

核心原因

Next.js Middleware 默认运行在Edge Runtime环境中,而 Mongoose 依赖 Node.js 专属的 API(如 fs、net 等),当前版本的 Mongoose 并不支持 Edge Runtime,这是导致 connect is not a function 错误的根本原因。


解决方案1:将数据库连接移至 Node.js Runtime 环境

把数据库连接逻辑放到 API 路由、Server Components 或 Server Actions 中,这些模块运行在 Node.js 环境,完全兼容 Mongoose。

示例:在 API 路由中实现连接

创建 src/app/api/db-connect/route.ts:

import mongoose from "mongoose";
import { NextResponse } from "next/server";

// 建议将连接字符串存到环境变量中
const MONGODB_URI = process.env.MONGODB_URI || "mongodb+srv://root:toor@capxlogicsh.neqdpxf.mongodb.net/?retryWrites=true&w=majority";

export async function GET() {
  try {
    // 避免重复连接
    if (mongoose.connection.readyState === 1) {
      return NextResponse.json({ message: "数据库已连接" });
    }
    await mongoose.connect(MONGODB_URI);
    return NextResponse.json({ message: "数据库连接成功" });
  } catch (err) {
    console.error("连接失败:", err);
    return NextResponse.json({ error: "连接失败" }, { status: 500 });
  }
}

示例:在 Server Component 中调用连接

// src/app/page.tsx
import mongoose from "mongoose";

async function connectDB() {
  const MONGODB_URI = process.env.MONGODB_URI || "mongodb+srv://root:toor@capxlogicsh.neqdpxf.mongodb.net/?retryWrites=true&w=majority";
  try {
    if (mongoose.connection.readyState !== 1) {
      await mongoose.connect(MONGODB_URI);
      console.log("数据库连接成功");
    }
  } catch (err) {
    console.error("连接失败:", err);
  }
}

export default async function Home() {
  await connectDB();
  return <div>首页内容</div>;
}

解决方案2:改用支持 Edge Runtime 的 MongoDB 官方驱动

如果必须在 Middleware 中操作数据库,放弃 Mongoose,使用官方的 mongodb 包(它原生支持 Edge Runtime)。

  1. 安装依赖:
npm install mongodb
  1. 在 Middleware 中实现连接:
import { MongoClient } from "mongodb";
import { NextRequest, NextResponse } from "next/server";

const MONGODB_URI = process.env.MONGODB_URI || "mongodb+srv://root:toor@capxlogicsh.neqdpxf.mongodb.net/?retryWrites=true&w=majority";

export const middleware = async (request: NextRequest) => {
  const client = new MongoClient(MONGODB_URI);
  
  try {
    await client.connect();
    console.log("数据库连接成功");
    // 在这里执行你的数据库操作,比如查询、插入等
    const db = client.db();
    // 示例:const data = await db.collection('users').findOne({});
  } catch (err) {
    console.error("连接失败:", err);
  } finally {
    await client.close();
  }

  return NextResponse.next();
};

export const config = {};

额外注意事项

  • 数据库连接字符串不要硬编码,建议存放在 .env.local 文件中,通过 process.env 读取
  • 无论使用哪种方案,都要避免重复建立数据库连接,可通过检查连接状态或使用连接池优化性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:34