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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:27:58