Next.js 13.3版本中使用Mongoose连接MongoDB报错求助
Next.js 13.3 + Mongoose 连接 MongoDB 分步方案
一、前置准备
- 确保已安装 Mongoose:执行
npm install mongoose或yarn add mongoose - 在项目根目录创建
.env.local文件,添加 MongoDB 连接字符串:
替换占位符为你的实际 MongoDB 信息,保存后重启 Next.js 开发服务器。MONGO_URI="mongodb+srv://<你的用户名>:<你的密码>@<集群地址>/<数据库名>?retryWrites=true&w=majority"
二、重构数据库连接逻辑(适配 App Router)
原连接代码是针对 Page Router 的 handler 包装,App Router 的 API 路由不适用,需改为独立连接函数:
- 在项目根目录创建
lib/mongodb.js文件:
import mongoose from 'mongoose'; export async function connectDb() { // 检查是否已连接,避免重复连接 if (mongoose.connections[0].readyState === 1) { return; } try { await mongoose.connect(process.env.MONGO_URI, { dbName: '你的数据库名称', // 可选,指定要连接的数据库 }); console.log('MongoDB 连接成功'); } catch (err) { throw new Error(`数据库连接失败:${err.message}`); } }
三、修复 User Schema 模块语法
原代码混用 CommonJS 和 ES 模块语法,导致导入错误,统一改为 ES 模块:
修改 models/User.js 文件:
import mongoose from 'mongoose'; const UserSchema = new mongoose.Schema( { name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, }, { timestamps: true } ); // 避免热重载时重复创建模型 const User = mongoose.models.User || mongoose.model('User', UserSchema); export default User;
四、在 API 路由中正确使用
修改 app/api/getProducts/route.js 文件(若使用 Page Router 则对应 pages/api/getProducts.js):
import { connectDb } from '../../../lib/mongodb'; import User from '../../../models/User'; export async function GET(request) { try { // 先建立数据库连接 await connectDb(); // 示例:查询用户数据(可替换为你的业务逻辑) // const products = await User.find({}); // return new Response(JSON.stringify(products), { // status: 200, // headers: { 'Content-Type': 'application/json' } // }); return new Response('Hello, Next.js!', { status: 200 }); } catch (error) { return new Response(JSON.stringify({ error: error.message }), { status: 500, headers: { 'Content-Type': 'application/json' } }); } }
常见错误原因说明
- 模块语法冲突:原 User.js 中用
require导入 Mongoose,却用export default导出模型,两种模块系统混用导致报错。 - 连接逻辑不适配:原
connectDb是为 Page Router 的 API 路由设计的包装函数,App Router 的 API 路由直接导出 GET/POST 函数,无法使用该包装方式。 - 环境变量未加载:未在
.env.local中正确配置MONGO_URI,或未重启开发服务器导致变量未生效。
内容的提问来源于stack exchange,提问作者Hammad Qurashi
相关产品推荐
相关产品推荐

