首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在可注入的构造函数中添加参数,同时仍然让Nest管理依赖注入?

如何在可注入的构造函数中添加参数,同时仍然让Nest管理依赖注入?
EN

Stack Overflow用户
提问于 2021-06-13 19:04:43
回答 1查看 40关注 0票数 0

我已经创建了一个自定义的防护,如下所示:

代码语言:javascript
复制
@Injectable()
export class MyCustomGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
    private myService: MyService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const idParam = request.params.id;
    ...
  }
}

我在我的控制器中像这样使用它:

代码语言:javascript
复制
@UseGuards(MyCustomGuard)
@Controller('my-controller')
export class MyController {
 ...
}

它工作得很好,但我想在实例化防护时将id参数键设置为参数,如下所示:

代码语言:javascript
复制
@Injectable()
export class MyCustomGuard implements CanActivate {
  constructor(
    private idKey: string,
    private reflector: Reflector,
    private myService: MyService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const idParam = request.params[idKey];
    ...
  }
}

然后我将不得不在我的控制器中手动实例化卫士:

代码语言:javascript
复制
@UseGuards(new MyCustomGuard('id', ...?))
@Controller('my-controller')
export class MyController {
  ...
}

我的问题是,如果我这样做,那么我将不得不手动实例化我的guard的其他构造函数参数:反射器和服务。这是可能的,但出于简单性和性能的原因,我宁愿让Nest来管理它。然后我的问题是:有没有办法手动实例化guard (这样我就可以给它提供idKey参数),但仍然让Nest管理其他参数的依赖注入?似乎使用ModuleRef可以在这里工作,但我真的不知道这是不是正确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-14 02:19:07

我建议将idKey反映为类的元数据,而不是将其作为构造函数参数传递。通过这种方式,您可以执行以下操作

代码语言:javascript
复制
@IdKey('id')
@UseGuards(MyCustomGuard)
@Controller('my-controller')
export class MyController {
...
}

在你的守卫下,你会做这样的事情

代码语言:javascript
复制
@Injectable()
export class MyCustomGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
    private myService: MyService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const idParam = request.params.id;
    const idKey = this.getIdKey(context);
    ...
  }

  getIdKey(context: ExecutionContext) {
    return this.reflector.get('id-key', context.getClass());
  }
}

这里假设你的@IdKey()看起来像这样

代码语言:javascript
复制
export const IdKey = (key: string) => SetMetadata(key);

SetMetadata来自@nestjs/common的地方

You can read more about @SetMetadata() and metadata rerflection here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67957525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档