如何在 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 在这里。
我这里有这条路线:
@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 在这里。