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

NestJS+Mongoose项目报Cannot read property 'connect' of undefined如何解决

问题原因

  • Mongoose导入语法不匹配:Mongoose 6及以上版本采用CommonJS规范导出核心对象,未配置esModuleInterop的TypeScript环境下,import mongoose from 'mongoose'默认导入的对象为undefined
  • 冗余的连接配置:你已经通过@nestjs/mongoose提供的MongooseModule.forRoot()完成了MongoDB连接初始化,自定义的databaseProviders属于重复连接逻辑,易引发冲突
  • 环境变量加载时机错误:如果你的MONGO_DB_CONNECTION_STRING读取自环境变量,当前ConfigModule初始化顺序晚于MongooseModule,会导致连接字符串未加载就被调用

解决方案

方案1:修复自定义Provider的导入问题

修改database/database.providers.ts的导入语法即可:

// 将默认导入改为全量导入
import * as mongoose from 'mongoose';
import {MONGO_DB_CONNECTION_STRING} from './constants/constants';

export const databaseProviders = [
    {
        provide: 'DATABASE_CONNECTION',
        useFactory: async (): Promise<typeof mongoose> =>
        {
            return await mongoose.connect(MONGO_DB_CONNECTION_STRING)
        }
    },
];

如果希望保留默认导入语法,在tsconfig.json的compilerOptions中添加配置:

{
  "compilerOptions": {
    "esModuleInterop": true
  }
}

方案2(更推荐):直接使用@nestjs/mongoose的封装能力,删除冗余自定义逻辑

你不需要自己实现数据库连接Provider,@nestjs/mongoose已经完成了所有封装,直接清理冗余代码即可:

  1. 删除database.providers.ts、DatabaseModule相关文件和引用
  2. 调整app.module.ts配置,修正环境变量加载顺序:
@Module({
  imports: [
    // ConfigModule放在首位,确保先加载环境变量
    ConfigModule.forRoot({ isGlobal: true }),
    // 改用异步加载方式从环境变量取连接字符串
    MongooseModule.forRootAsync({
      useFactory: () => ({
        uri: process.env.MONGO_DB_CONNECTION_STRING
      })
    }),
    GraphQLModule.forRoot({
      autoSchemaFile: "schema.gql",
    }),
    ApartmentModule,
    UsersModule,
    FavoriteModule,
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService, ...userProviders],
})
export class AppModule {}

两种方案任选其一即可解决报错。

内容的提问来源于stack exchange,提问作者BURGERFLIPPER101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:03