Nest.js 无法将提供商注入守卫

Nest.js can't inject providers into guard

[Nest] 20308 - 16.12.2021, 17:08:50 ERROR [ExceptionHandler] Nest can't resolve dependencies of the AuthGuard (?, AuthService, Reflector). Please make sure that the argument UserService at index [0] is available in the AppModule context.

Potential solutions:

  • If UserService is a provider, is it part of the current AppModule?
  • If UserService is exported from a separate @Module, is that module imported within AppModule? @Module({ imports: [ /* the Module containing 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 但我总是得到同样的错误。我也搜索了这个问题,但没有找到解决问题的方法。

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

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 中需要两个模块,所以我创建了一个模块前向引用,因为它们相互依赖。