Next.js 13.2 App目录下API引入Mongoose连接MongoDB遭遇TypeError错误求助
Next.js 13.2 App目录下API引入Mongoose连接MongoDB遭遇TypeError错误求助
大家好,我正在用Next.js 13.2的App Router开发项目,尝试连接MongoDB时遇到了一个TypeError,卡了好一阵子,希望能得到大家的帮助。
我的代码文件
app/api/hello/route.js(原hello.js)
import connectMongo from '../../../util/connectDB'; import UserModel from '../../../models/UserModel'; import { NextResponse } from 'next/server' export async function GET(request) { return NextResponse.json({hello: 'Hello, Next.js!'}) } export async function POST(request) { const data = await request.json(); console.log(data); return NextResponse.json(data) }
util/connectDB.js(注:原文件名拼写为connextDB,我修正了拼写)
import mongoose from 'mongoose'; const connectMongo = () => { try { const conn = mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, }); console.log(`MongoDB Connected: ${conn.connection.host}`); } catch (error) { console.error(`Error: ${error.message}`); process.exit(1); } }; export default connectMongo;
遇到的错误信息
error - node_modules/mongoose/lib/types/objectid.js (21:31) @ prototype error - TypeError: Cannot read properties of undefined (reading 'prototype') at eval (webpack-internal:///(sc_server)/./node_modules/mongoose/lib/types/objectid.js:15:36) at Object.(sc_server)/./node_modules/mongoose/lib/types/objectid.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:2728:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:7:18) at Object.(sc_server)/./node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:451:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./node_modules/mongoose/lib/drivers/node-mongodb-native/index.js:4:22) at Object.(sc_server)/./node_modules/mongoose/lib/drivers/node-mongodb-native/index.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:473:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./node_modules/mongoose/lib/index.js:4:100) at Object.(sc_server)/./node_modules/mongoose/lib/index.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:2057:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./node_modules/mongoose/index.js:5:18) at Object.(sc_server)/./node_modules/mongoose/index.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:242:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./models/UserModel.js:5:66) at Module.(sc_server)/./models/UserModel.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:154:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./app/api/hello/route.js:6:75) at Module.(sc_server)/./app/api/hello/route.js (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/app/api/hello/route.js:143:1) at webpack_require (/Users/avinashsethu/Desktop/Development/ekali-lms/.next/server/webpack-runtime.js:33:43) at eval (webpack-internal:///(sc_server)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fhello%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fhello%2Froute.js&appDir=%2FUsers%2Favinashsethu%2FDesktop%2FDevelopment%2Fekali-lms%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Favinashsethu%2FDesktop%2FDevelopment%2Fekali-lms&isDev=true&tsconfigPath=tsconfig.json&assetPrefix=!:13:130) at Module.(sc_server)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fhello%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fhello%2Froute.js&appDir=%2FUsers%2Favinashsethu%2FDesktop%2FDevelopment%2Fekali-lms%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Favinashsethu%2FDesktop%2FDevelopment%2Fekali-lms&isDev=true&tsconfigPath=tsconfig.json&assetPrefix=! at /Users/avinashsethu/Desktop/Development/ekali-lms/node_modules/next/dist/server/load-components.js:49:73 at async Object.loadComponentsImpl [as loadComponents] (/Users/avinashsethu/Desktop/Development/ekali-lms/node_modules/next/dist/server/load-components.js:49:26) at async DevServer.findPageComponentsImpl (/Users/avinashsethu/Desktop/Development/ekali-lms/node_modules/next/dist/server/next-server.js:599:36) { page: '/api/hello' }
我现在必须解决这个MongoDB连接的问题,不然没法继续开发我的应用。我已经检查过环境变量里的MONGODB_URI是正确的,也尝试过重启开发服务器,但还是报这个错。有没有大佬能帮忙分析下问题出在哪,或者给些可行的解决方案?
补充:可能的排查方向(供参考)
- 版本兼容性问题:Next.js 13 App Router对Mongoose版本有要求,旧版本(比如6.x)可能和Next.js的服务器组件打包逻辑不兼容,建议升级到Mongoose 7.x以上:
npm install mongoose@latest - 连接函数的异步问题:原
connectMongo函数里,mongoose.connect是异步操作,但没有用await,导致conn是Promise对象而非实际连接实例,conn.connection.host会报错。可以改成异步函数并添加单例判断避免重复连接:import mongoose from 'mongoose'; let isConnected = false; const connectMongo = async () => { if (isConnected) { console.log('已连接MongoDB,无需重复连接'); return; } try { const conn = await mongoose.connect(process.env.MONGODB_URI); isConnected = true; console.log(`MongoDB Connected: ${conn.connection.host}`); } catch (error) { console.error(`连接失败:${error.message}`); process.exit(1); } }; export default connectMongo; - UserModel的定义问题:错误追踪到了UserModel的第5行,可能模型里使用了Mongoose已废弃的API,或者重复创建模型。建议模型定义时添加判断避免热重载重复注册:
// models/UserModel.js示例 import mongoose from 'mongoose'; const userSchema = new mongoose.Schema({ name: String, email: { type: String, unique: true }, }); export default mongoose.models.User || mongoose.model('User', userSchema);
备注:内容来源于stack exchange,提问作者Avinash Sethu
相关产品推荐
相关产品推荐

