繁体   English   中英

Nest.js - 向全局警卫注入服务

[英]Nest.js - injecting service to a global guard

我有一个全局守卫,它在 main.ts 中像这样注册:

app.useGlobalGuards(new CheckUserGuard());

但是,在这个守卫内部,我需要获取登录用户的 ID,然后,使用另一个服务,我必须在数据库中检查与他相关的内容,基本上是这样的:

@Injectable()
export class CheckUserGuard {
  constructor(private userService: UserService) {}
  async canActivate(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    const { req } = ctx.getContext();

    if(this.userService.isFine(req.user)) return true;
    return false;
  }
}

问题是,我怎样才能将 userService 传递给构造函数才能使用它? userService 还依赖于其他一些服务

与其使用app.useGlobalGuards()你必须自己传递守卫的实例,为什么不使用APP_GUARD提供者并让 Nest 为你处理 DI?

@Module({
  imports: [...moduleImports],
  controllers: [...moduleControllers],
  providers: [
    ...moduleProviders,
    {
      provide: APP_GUARD,
      useClass: CheckUserGuard,
    },
  },
})
export class FeatureModule {}

这使守卫成为全局绑定守卫,并且您可以从 Nest 中获得依赖注入的好处。 只要UserService在定义保护的模块上下文中可用,这种方法就可以完美地工作,甚至可以减少测试中的设置,因为不需要再次调用useGlobalGuards()

就个人而言,我喜欢将这些全局增强器添加到AppModule中,但您可能希望将它们放在对您的应用程序有意义的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM