When I try to use MongooseModel
on Users
I am getting the following error
Nest can’t resolve dependencies of the UserModel (?). Please make sure that the argument DatabaseConnection at index [0] is available in the MongooseModule context.
/src/database/database.module.ts
import { Module } from '@nestjs/common'; import { databaseProviders } from './database.providers'; import { ConfigModule } from '../config/config.module'; @Module({ imports: [ConfigModule], providers: [...databaseProviders], exports: [...databaseProviders], }) export class DatabaseModule {}
/src/database/database.provider.ts
// NPM Packages import * as mongoose from 'mongoose'; import { Provider } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; // Custom Packages import { ConfigService } from '../config/config.service'; export const databaseProviders: Provider[] = [ { inject: [ConfigService], provide: 'DATABASE_CONNECTION', useFactory: async ( configService: ConfigService, ): Promise<typeof mongoose> => await mongoose.connect(configService.get('MONGODB_URI'), { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false, }), }, ];
/src/app.module.ts
// Core Packages import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; // NPM Packages // Custom Packages import { ConfigModule } from './config/config.module'; import { DatabaseModule } from './database/database.module'; import { AuthModule } from './auth/auth.module'; import { UsersModule } from './users/users.module'; @Module({ imports: [ConfigModule, DatabaseModule, AuthModule, UsersModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}
/src/auth/auth.module.ts
// Core Packages import { Module } from '@nestjs/common'; // NPM Packages import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; // Custom Packages import { AuthService } from './auth.service'; import { LocalStrategy } from './local.strategy'; import { JwtStrategy } from './jwt.strategy'; import { UsersModule } from '../users/users.module'; import { jwtConstants } from './constants'; import { AuthController } from './auth.controller'; import { ConfigService } from 'src/config/config.service'; import { ConfigModule } from 'src/config/config.module'; import { DatabaseModule } from 'src/database/database.module'; @Module({ imports: [ ConfigModule, DatabaseModule, UsersModule, PassportModule, JwtModule.registerAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ secret: configService.get('JWT_SECRET'), signOptions: { expiresIn: configService.get('JWT_EXPIRE') }, }), inject: [ConfigService], }), ], providers: [AuthService, LocalStrategy, JwtStrategy], exports: [AuthService], controllers: [AuthController], }) export class AuthModule {}
/src/users/user.module.ts
// Core Packages import { Module } from '@nestjs/common'; // NPM Packages import { MongooseModule } from '@nestjs/mongoose'; // Custom Packages import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { UserSchema } from './schemas/user.schema'; import { DatabaseModule } from 'src/database/database.module'; @Module({ providers: [UsersService], exports: [UsersService], controllers: [UsersController], imports: [ DatabaseModule, MongooseModule.forFeature([{ name: 'User', schema: UserSchema }]), ], }) export class UsersModule {}
Advertisement
Answer
Instead of configuring mongoose statically in your database.provider.ts
, you should use the MongooseModule.forRootAsync
import:
MongooseModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ uri: configService.getString('MONGODB_URI'), useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false, }), inject: [ConfigService], });