javascript 当我在app模块中导入模块时,为什么nest js会出现依赖注入错误?

ruarlubt  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(209)

这是我的代码:
认证模块:

@Module({
  imports: [
    TypeOrmModule.forFeature([User]),
    JwtModule.register({
      secret: 'secret',
      signOptions: {
        expiresIn: '365d',
      }
    })
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}

身份验证控制器:

@Controller("api")
export class AuthController {
  constructor(private readonly appService: AuthService, private readonly jwtService:JwtService ) {}
}

授权服务:

@Injectable()
export class AuthService {
  constructor(@InjectRepository(User) private userRepo:Repository<User>) {}
}

授权保护:

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private readonly jwtService:JwtService,private readonly userService:AuthService) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    return ...
  }
}

App模块:

@Module({
  imports: [
    AuthModule,
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '',
      database: 'nestjs',
      entities: [User,Post],
      synchronize: true,
    }),
    TypeOrmModule.forFeature([Post]),
  ],
  controllers: [PostController],
  providers: [PostService],

})
export class AppModule{}

而我有这个错误:Nest无法解析AuthGuard(?、AuthService)。请确保索引[0]处的参数JwtService在AppModule上下文中可用。
我在auth模块中定义了jwt服务,并在app模块中导入了auth模块,但错误说我应该在app模块中导入jwt服务,为什么?
我也检查了我在应用程序模块中的导入

bprjcwpo

bprjcwpo1#

我假设在AppModulePostController中,您通过@UseGuards(AuthGuard)使用这个AuthGuard类。当你这样做的时候,Nest会尝试在当前控制器的模块(在这个例子中是AppModule)的上下文中创建一个守卫的示例。为此,Nest将查看AuthGuard的参数并从模块的上下文中提取它们,首先查看立即的providers,然后查看imports阵列中模块的exports。如果找不到这些提供程序,将引发错误。
在您的例子中,在AuthModule中,您应该将AuthServiceJwtModule添加到exports阵列,以提供对AuthService的直接访问,并通过模块重新导出提供对JwtService的访问。最终的AuthModule应该看起来像这样:

@Module({
  imports: [
    TypeOrmModule.forFeature([User]),
    JwtModule.register({
      secret: 'secret',
      signOptions: {
        expiresIn: '365d',
      }
    })
  ],
  controllers: [AuthController],
  providers: [AuthService],
  exports: [AuthService, JwtModule],
})
export class AuthModule {}

现在,在任何需要使用AuthGuard的控制器类中,确保将AuthModule添加到控制器模块的导入中,这样就可以开始了。

6tr1vspr

6tr1vspr2#

除了authService,您还需要在auth中添加JWTService到提供者。模块。如果您正在使用任何其他服务,请将其添加到auth中。模块提供商。如果你的错误仍然存在,请在评论中告诉我。

相关问题