Mongoose 7.0.1在Next.js 13.2.2中连接MongoDB时出现prototype读取错误
针对你用Mongoose 7.0.1 + Next.js 13.2.2 + React 18.2.0遇到的问题,结合Next.js 13 App Router的特性,给你几个针对性的解决方案:
严格区分服务器/客户端代码边界
Mongoose是Node.js端的数据库库,绝对不能在标注了'use client'的客户端组件中导入或使用。检查你的library/mongo/index.ts是否被客户端组件引用,如果有,必须把数据库操作逻辑完全迁移到服务器端(比如API路由、服务器组件、Server Actions)。用单例模式实现Mongoose连接适配Next.js缓存
Next.js开发模式的热重载容易导致重复创建数据库连接,进而引发异常。调整连接代码为单例模式:// library/mongo/index.ts import mongoose from 'mongoose'; const MONGODB_URI = process.env.MONGODB_URI!; if (!MONGODB_URI) { throw new Error('请在.env.local中配置MONGODB_URI环境变量'); } // 利用全局变量缓存连接实例,避免重复连接 let cached = global.mongoose; if (!cached) { cached = global.mongoose = { conn: null, promise: null }; } export async function connectDB() { if (cached.conn) { return cached.conn; } if (!cached.promise) { const opts = { bufferCommands: false, }; cached.promise = mongoose.connect(MONGODB_URI, opts).then(mongoose => { return mongoose; }); } cached.conn = await cached.promise; return cached.conn; }禁用Edge Runtime(如果启用了)
Mongoose目前不支持Next.js的Edge Runtime,检查你的app/api/route.ts,如果有export const runtime = 'edge'这行代码,直接删除即可(默认运行时为nodejs,完全兼容Mongoose)。验证TypeScript配置
确保tsconfig.json的相关配置正确,ES6导入可正常工作:{ "compilerOptions": { "module": "ESNext", "moduleResolution": "bundler", "target": "ES2020" } }不需要切换到CommonJS的
require导入,Next.js会自动处理模块兼容。清除缓存后重新构建
缓存可能导致依赖加载异常,执行以下命令清除缓存后重新构建:rm -rf .next node_modules/.cache npm run build
如果以上步骤仍未解决问题,建议检查app/api/route.ts中调用Mongoose的逻辑,确保是在服务器端函数(比如GET、POST)内部调用连接方法,而非在模块顶层直接执行。
内容的提问来源于stack exchange,提问作者Amari Willis

