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)。
- 安装依赖:
npm install mongodb
- 在 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
相关产品推荐
相关产品推荐

