在NestJS中,有什么方法可以将数据从Guards传递到控制器?

时间:2019-11-05 15:22:48

标签: javascript express nestjs fastify

因此,我目前在我的组织中广泛使用NestJS。为了进行身份验证,我们使用了自己的防护装置。因此,我的问题是,除了expressjs的response.locals之外,是否有人可以引导我将数据从后卫传递到控制器?这在框架上造成了硬性依赖,我目前不希望如此。

TIA。

3 个答案:

答案 0 :(得分:0)

将数据从Guard传递到Controller的唯一可能方法是将数据附加到请求中的字段或使用某种元数据反射,这可能会变得更具挑战性。

在警卫队中,您可以使用canActivate这样的功能

canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
  const req = context.switchToHttp().getRequest();
  if (/* some logic with req */) {
    req.myData = 'some custom value';
  }
  return true;
}

然后在控制器中,您可以拉回req.myData并返回some custom value字符串。

答案 1 :(得分:0)

您可以创建自定义装饰器来获取数据,而不必使用Guard:

export const Authorization = createParamDecorator((_, request: any) => {
  const { authorization: accessToken } = request.headers;
  try {
    const decoded = jwt.verify(accessToken, process.env.JWT_HASH);
    return pick(decoded, 'userId');
  } catch (ex) {
    throw new InvalidToken();
  }
});

export interface AuthUser {
  userId: string;
}

并像这样传递给您的控制器:

  @Post()
  createFeedback(
    @Body() body: FeedbackBody,
    @Authorization() user: AuthUser,
  ): Promise<Feedback> {
    body.userId = user.userId;
    return this.feedbackService.feedback(body, user);
  }

这可以起到保护作用,因为当您的令牌无效时,它将引发异常

答案 2 :(得分:-2)

就像其他人所说的那样,您可以在守卫上的请求对象上传递数据,但是通过@Req装饰器接收数据并不理想,特别是如果您对请求对象没有其他用途的话。您可以创建一个自定义装饰器,该装饰器将检索所需的数据并将其注入到任何控制器中