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;
}
}
我只想将 AuthService 和 UserService 注入 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
中需要两个模块,所以我创建了一个模块前向引用,因为它们相互依赖。
[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;
}
}
我只想将 AuthService 和 UserService 注入 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
中需要两个模块,所以我创建了一个模块前向引用,因为它们相互依赖。