Dren
Dren

Reputation: 1099

Nest can't resolve dependencies of the JwtService

I have created some modules here but i am facing an error

Auth module

   import { Module } from "@nestjs/common";
import { AuthService } from "./auth.service";
import { LocalStrategy } from "./local.strategy";
import { JwtStrategy } from "./jwt.strategy";
import { UsersModule } from "../users/users.module";
import { PassportModule } from "@nestjs/passport";
import { JwtModule, JwtService } from "@nestjs/jwt";
import { jwtConstants } from "./constants";
import { ConfigModule, ConfigService } from "@nestjs/config";

@Module({
    imports: [
        UsersModule,
        PassportModule,
        JwtModule.register({
            secret: jwtConstants.secret,
            signOptions: { expiresIn: "1d" },
        }),
    ],
    providers: [AuthService, LocalStrategy, JwtStrategy],
    exports: [AuthService, LocalStrategy, JwtStrategy],
})
export class AuthModule {}

Email module

  import { Module } from "@nestjs/common";
import EmailService from "./email.service";

import { ConfigModule } from "@nestjs/config";

import { EmailConfirmationService } from "./emailConfirmation.service";
import { EmailConfirmationController } from "./emailConfirmation.controller";
import { EmailConfirmationGuard } from "./guards/emailConfirmation.guard";
import { AuthModule } from "src/auth/auth.module";
import { UsersModule } from "src/users/users.module";

@Module({
    imports: [ConfigModule,AuthModule,UsersModule],
    providers: [EmailService,EmailConfirmationService,EmailConfirmationGuard],
    exports: [EmailConfirmationService,EmailConfirmationGuard],
    controllers : [EmailConfirmationController]
})
export class EmailModule {}

User module

import { Module } from "@nestjs/common";
import { UsersService } from "./users.service";
import { UsersController } from "./users.controller";
import { MongooseModule } from "@nestjs/mongoose";
import { UserSchema } from "./entities/user.entity";
import { EmailModule } from "src/email/email.module";

@Module({
    imports: [MongooseModule.forFeature([{ name: "User", schema: UserSchema }]),EmailModule],
    providers: [UsersService],
    exports: [UsersService],
    controllers: [UsersController],
})
export class UsersModule {}

Error I am facing

 [Nest] 9200  - 09/26/2021, 3:43:15 PM   ERROR [ExceptionHandler] Nest cannot create the EmailModule instance.
The module at index [1] of the EmailModule "imports" array is undefined.

Potential causes:
- A circular dependency between modules. Use forwardRef() to avoid it. Read more: https://docs.nestjs.com/fundamentals/circular-dependency
- The module at index [1] is of type "undefined". Check your import statements and the type of the module.

Scope [AppModule -> AuthModule -> UsersModule]
Error: Nest cannot create the EmailModule instance.
The module at index [1] of the EmailModule "imports" array is undefined.

Potential causes:
- A circular dependency between modules. Use forwardRef() to avoid it. Read more: https://docs.nestjs.com/fundamentals/circular-dependency
- The module at index [1] is of type "undefined". Check your import statements and the type of the module.

What am i missing ?

EmailConfirmationService is used in UsersController
UserService is used in EmailConfirmationService

Upvotes: 3

Views: 4793

Answers (3)

Denis Sheremetov
Denis Sheremetov

Reputation: 76

Make sure your target in tsconfig.json is es6.

Upvotes: 0

huudyy
huudyy

Reputation: 317

In order to use EmailService in you UserController and also UserService is used in EmailConfirmationService then you have to do something like this in UserModule:

imports: [forwardRef(() => EmailModule)]

and inside the EmailModule do the same thing for the UserModule:

imports: [forwardRef(() => UserModule)]

Rest of the imports should be without the forwardRef(()=>)

you can read more about circular dependency here https://docs.nestjs.com/fundamentals/circular-dependency

Upvotes: 2

Jesse Carter
Jesse Carter

Reputation: 21147

You have JwtService listed in your imports. Imports are for modules only.

Share the code from JwtService as well so that we can make sure there are no other issues.

Update: If the EmailModule wants to use the exports from the AuthModule (JwtService in this case), it must add the AuthModule to its imports array.

This is the entire premise of the DI system, modules share things between eachother by placing the thing they intend to share in the exports array. After that, any module can add the Source module to its imports array to gain access to the things that the source exported. The error message literally spells it out for you:

If JwtService is exported from a separate @Module, is that module imported within EmailModule? @Module({ imports: [ /* the Module containing JwtService */ ] })

Upvotes: 5

Related Questions