如何在 Guards NestJS 之前访问请求对象

How to access the request object before a Guards NestJS

我这里有这条路线:

@UseGuards(LocalAuthGuard)
  @Post('login')
  async login(
    @Request() req,
    @Body(new LoginUserValidationPipe()) body: LoginUserDto,
  ) {
    return this.authService.issueJWT(req.user);
  }

我现在正在处理错误。此路由需要一个具有两个属性的对象:电子邮件和密码。我正在考虑的场景是当用户发送请求时没有电子邮件 属性,只有密码。但它失败了。我确实使用 class-validator 包来处理错误和验证,但请求永远不会到达那里。我认为 Guards 已经发现有问题并抛出错误,但我不希望这样。我本地攻略如下:

export class LocalStrategy extends PassportStrategy(Strategy, 'local') {
  constructor(private authService: AuthService) {
    super({
      usernameField: 'email',
    });
  }

  async validate(email: string, password: string): Promise<UserDto> {

    const user = await this.authService.validateUser(email, password);
    if (!user) {
      throw new NotFoundException();
    }
    return user;
  }
}

有谁知道如何在 Guards 之前访问请求?我尝试创建另一个 Guard 并将其放在这个之前,但是没有用。

Guards are always ran before other enhancers 正如文档中所述。 运行 一个守卫在另一个守卫之前的唯一方法是将其置于更高的优先级(要么在更高的处理程序级别 [例如,原始守卫是路由处理程序级别,因此新守卫处于控制器级别])或将其放置在 @UseGuards() 守卫前。您的另一个选择是 运行 一个中间件来验证您的 body 在这里。