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已经完成了所有封装,直接清理冗余代码即可:
- 删除
database.providers.ts、DatabaseModule相关文件和引用 - 调整
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
相关产品推荐
相关产品推荐

