【问题标题】:Nest can't resolve dependencies of the JwtService though exported from another module尽管从另一个模块导出,Nest 无法解析 JwtService 的依赖关系
【发布时间】:2021-12-01 03:27:48
【问题描述】:

我在我的 NestJS 项目中使用 @nestjs/jwt

我有两个模块,AuthModuleAppModule

  • AuthModule 使用@nestjs/jwt
  • AppModuleAuthModule 调用身份验证服务。

AuthService:

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { ForbiddenException } from '@nestjs/common';

@Injectable()
export class AuthService {
  constructor(private readonly jwt: JwtService) {}

  async validate(token: string) {
    return this.jwt.verify(token);
  }
   ...
}

授权模块:

import { Module } from '@nestjs/common'
import { TokenService } from './auth.service'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { JwtModule } from '@nestjs/jwt'

@Module({
  imports: [
    JwtModule.register({
          secret: "mysecret",
          signOptions: { expiresIn: "60s" },
        }),
  ],
  // I provide AuthService & JwtService
  providers: [AuthService, JwtService], 
  // I export AuthService and JwtService
  exports: [AuthService, JwtService],
})
export class AuthModule {}

应用模块:

@Module({
  imports: [
    AuthModule,
    ...
  ],
  controllers: [AppController],
  // I provide AuthService & JwtService also in AppModule
  providers: [AppService, JwtService],
})
export class AppModule {}

AppController 调用 AuthService 实例来验证令牌。)

我经常出错:

Nest can't resolve dependencies of the JwtService (?). Please make sure that the argument JWT_MODULE_OPTIONS at index [0]

这是为什么呢?我错过了哪里?

【问题讨论】:

    标签: nestjs nestjs-passport nestjs-jwt


    【解决方案1】:

    您无需将JwtService 添加到providers。 Nest 将查看当前模块的providers,然后是导入模块的exports,然后是全局模块的exports,以查找不在它正在解析提供程序的级别中的提供程序。这意味着对于AuthService它将查找JwtModuleexports 并找到已创建的JwtService,并使用该实例。然后在AppModule中你不需要提到AuthServiceJwtService,只需导入导出AuthServiceJwtModuleAuthModule(做一些module re-exporting),你应该很好去


    编辑:添加模块代码:

    AuthModule

    import { Module } from '@nestjs/common'
    import { TokenService } from './auth.service'
    import { ConfigModule, ConfigService } from '@nestjs/config'
    import { JwtModule } from '@nestjs/jwt'
    
    @Module({
      imports: [
        JwtModule.register({
              secret: "mysecret",
              signOptions: { expiresIn: "60s" },
            }),
      ],
      providers: [AuthService],
      exports: [AuthService, JwtModule],
    })
    export class AuthModule {}
    

    应用模块

    @Module({
      imports: [
        AuthModule,
        ...
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}
    

    【讨论】:

    • 谢谢,您的回答实际上是我的第一个版本代码,但是由于我不断收到该错误,因此我在 AuthModuleAppModule 中明确提供了 AuthServiceJwtService。我再次尝试删除AppModule的provider数组中的两个服务只导入AuthModule,错误是一样的。
    • 第一个版本的错误是什么,因为它可能不一样,但相似。当前错误是因为您在 providers 数组中有 JwtService
    • 与我的意思完全相同的错误。就像我说的我再次尝试恢复到第一个版本,它确实是完全相同的错误。
    • 那么providers 数组中还有JwtService 吗?
    • 我在providersAuthModule 中拥有JwtService 而不是AppModule
    猜你喜欢
    • 2021-11-17
    • 2019-02-24
    • 2021-11-24
    • 2019-12-24
    • 1970-01-01
    • 2022-01-17
    • 2018-11-21
    • 2020-03-12
    • 2020-07-03
    相关资源
    最近更新 更多