这是我的代码:
认证模块:
@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服务,为什么?
我也检查了我在应用程序模块中的导入
2条答案
按热度按时间bprjcwpo1#
我假设在
AppModule
的PostController
中,您通过@UseGuards(AuthGuard)
使用这个AuthGuard
类。当你这样做的时候,Nest会尝试在当前控制器的模块(在这个例子中是AppModule
)的上下文中创建一个守卫的示例。为此,Nest将查看AuthGuard
的参数并从模块的上下文中提取它们,首先查看立即的providers
,然后查看imports
阵列中模块的exports
。如果找不到这些提供程序,将引发错误。在您的例子中,在
AuthModule
中,您应该将AuthService
和JwtModule
添加到exports
阵列,以提供对AuthService
的直接访问,并通过模块重新导出提供对JwtService
的访问。最终的AuthModule
应该看起来像这样:现在,在任何需要使用
AuthGuard
的控制器类中,确保将AuthModule
添加到控制器模块的导入中,这样就可以开始了。6tr1vspr2#
除了authService,您还需要在auth中添加JWTService到提供者。模块。如果您正在使用任何其他服务,请将其添加到auth中。模块提供商。如果你的错误仍然存在,请在评论中告诉我。