【问题标题】:Nest.js can't inject providers into guardNest.js 无法将提供程序注入警卫
【发布时间】:2022-01-19 17:50:58
【问题描述】:

[Nest] 20308 - 16.12.2021, 17:08:50 错误 [ExceptionHandler] Nest 无法解析 AuthGuard (?, AuthService, 反射器)。请确保索引处的参数 UserService [0] 在 AppModule 上下文中可用。

可能的解决方案:

  • 如果 UserService 是提供者,它是当前 AppModule 的一部分吗?
  • 如果 UserService 是从单独的 @Module 导出的,那么该模块是否会导入到 AppModule 中? @模块({ 导入:[ /* 包含 UserService 的模块 */ ] })

身份验证模块

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { JsonWebToken } from 'src/auth/jsonwebtoken';
import { UserModule } from 'src/user/user.module';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { Code, CodeSchema } from './db/code.schema';

@Module({
  imports: [
    UserModule,
    MongooseModule.forFeature([{name: Code.name, schema: CodeSchema}]),
  ],
  controllers: [AuthController],
  providers: [AuthService, JsonWebToken],
  exports: [AuthService]
})
export class AuthModule {}

用户模块

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './db/user.schema';
import { UserSettingsService } from './settings.service';
import { UserSettings, UserSettingsSchema } from './db/settings.schema';

@Module({
  imports: [
    MongooseModule.forFeature([{name: User.name, schema: UserSchema}]),
    MongooseModule.forFeature([{name: UserSettings.name, schema: UserSettingsSchema}]),
  ],
  providers: [UserService, UserSettingsService],
  controllers: [UserController],
  exports: [UserService, UserSettingsService]
})
export class UserModule {}

应用模块

import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';
import { MongooseModule } from '@nestjs/mongoose';
import { AuthModule } from './auth/auth.module';
import { ConfigModule } from '@nestjs/config';
import { ServicesModule } from './services/services.module';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:27017/user-service'),
    UserModule,
    AuthModule,
    ConfigModule.forRoot(),
    ServicesModule,
  ],
  providers: [],
})
export class AppModule {}

守卫

import { CanActivate, ExecutionContext, Inject, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { UserService } from 'src/user/user.service';
import { Request } from 'express';
import { AuthService } from 'src/auth/auth.service';
import { Reflector } from '@nestjs/core';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(
    @Inject('UserService') private userService: UserService, 
    @Inject('AuthService') private authService: AuthService, 
    private reflector: Reflector
  ) {}

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    //some code....
    //passed
    return true;
  }
}

我只想将 AuthServiceUserService 注入 AuthGuard 但我总是遇到同样的错误。我也搜索了问题,但没有找到任何解决问题的方法。

很高兴得到您的帮助,非常感谢!

【问题讨论】:

  • 我相信你可以放弃那些@Inject('UserService')@Inject('AuthService'),你不需要它们,因为你使用具体类作为类型。另外,您使用的是哪个版本的 Nestjs?
  • btw AuthGuard 用于哪个nestjs模块?因为目标模块应该已经导入UserModule,我猜
  • 哦,是的。我通过创建模块前向引用解决了这个问题。 AuthGuard中需要AuthModuleUserModule这两个模块。所以就像将模块导入另一个模块一样。
  • 不过感谢您的帮助!

标签: typescript dependency-injection nestjs


【解决方案1】:

AuthModule

import { forwardRef, Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { JsonWebToken } from 'src/auth/jsonwebtoken';
import { UserModule } from 'src/user/user.module';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { Code, CodeSchema } from './db/code.schema';

@Module({
  imports: [
    forwardRef(() => UserModule), //added this
    MongooseModule.forFeature([{name: Code.name, schema: CodeSchema}]),
  ],
  controllers: [AuthController],
  providers: [AuthService, JsonWebToken],
  exports: [AuthService]
})
export class AuthModule {}

用户模块

import { forwardRef, Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './db/user.schema';
import { UserSettingsService } from './settings.service';
import { UserSettings, UserSettingsSchema } from './db/settings.schema';
import { AuthModule } from 'src/auth/auth.module';

@Module({
  imports: [
    MongooseModule.forFeature([{name: User.name, schema: UserSchema}]),
    MongooseModule.forFeature([{name: UserSettings.name, schema: UserSettingsSchema}]),
    forwardRef(() => AuthModule) //added this
  ],
  providers: [UserService, UserSettingsService],
  controllers: [UserController],
  exports: [UserService, UserSettingsService]
})
export class UserModule {}

AuthGuard 中需要这两个模块,因此我创建了一个模块前向引用,因为它们相互依赖。

【讨论】:

    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多