NestJs在自定义验证器(类验证器)中获取请求实例或执行上下文

typescriptJS

1个回答

写回答

L山楂糕

2025-09-01 15:55

+ 关注

JS
JS

使用自定义验证器是 NestJS 中处理输入验证的一种强大方式。通过自定义验证器,我们可以自定义验证规则,并且可以在验证过程中获得请求实例或执行上下文的信息。在本篇文章中,我们将探讨如何在自定义验证器中获取请求实例或执行上下文,并提供一个案例代码来演示该过程。

什么是自定义验证器

在 NestJS 中,验证器是用来验证用户输入的数据是否符合特定规则的组件。NestJS 内置了一些常用的验证器,例如长度验证、正则表达式验证等。但是,在某些情况下,我们可能需要自定义的验证规则来满足特定的业务需求。这时,就需要使用自定义验证器。

如何获取请求实例或执行上下文

在 NestJS 中,自定义验证器是一个类装饰器,它需要实现 ValidatorConstrAIntInterface 接口的 validate 方法。在这个方法中,我们可以通过参数获取请求实例或执行上下文的信息。

为了获取请求实例,我们可以在自定义验证器类的构造函数中注入 Request 对象。例如:

import { Request } from 'express';

@ValidatorConstrAInt({ name: 'customValidator', async: false })

export class CustomValidator implements ValidatorConstrAIntInterface {

constructor(private readonly request: Request) {}

validate(value: any): boolean {

// 在这里可以通过 this.request 访问到请求实例

return true;

}

}

为了获取执行上下文的信息,我们可以在自定义验证器类的构造函数中注入 ExecutionContext 对象。例如:

import { ExecutionContext } from '@nestJS/common';

@ValidatorConstrAInt({ name: 'customValidator', async: false })

export class CustomValidator implements ValidatorConstrAIntInterface {

constructor(private readonly context: ExecutionContext) {}

validate(value: any): boolean {

// 在这里可以通过 this.context 访问到执行上下文的信息

return true;

}

}

案例代码

假设我们正在开发一个用户注册的功能,需要验证用户输入的用户名是否已经存在。我们可以使用自定义验证器来实现这个验证规则,并在验证过程中获取请求实例和执行上下文的信息。

首先,我们需要创建一个自定义验证器类 UsernameValidator,并在其中实现 ValidatorConstrAIntInterface 接口的 validate 方法。在这个方法中,我们可以通过请求实例和执行上下文的信息来判断用户名是否已经存在。

import { ValidatorConstrAInt, ValidatorConstrAIntInterface, ValidationArguments } from 'class-validator';

import { Request } from 'express';

@ValidatorConstrAInt({ name: 'username', async: false })

export class UsernameValidator implements ValidatorConstrAIntInterface {

constructor(private readonly request: Request) {}

validate(value: string, args: ValidationArguments): boolean {

const { username } = this.request.body;

// 在这里可以通过 this.request 访问到请求实例

// 在这里可以通过 args.object 访问到执行上下文的信息

// 根据业务逻辑判断用户名是否已经存在

// 假设我们的数据库中已经存在一个用户名为 'admin' 的用户

if (value === 'admin') {

return false;

}

return true;

}

}

然后,我们需要在用户输入的 DTO 类中使用自定义验证器。假设我们的 DTO 类为 RegisterUserDto,其中包含一个 username 属性,我们可以在 username 属性上使用 @Validate 装饰器,并指定自定义验证器 UsernameValidator

import { IsNotEmpty, Validate } from 'class-validator';

import { UsernameValidator } from './username.validator';

export class RegisterUserDto {

@IsNotEmpty()

@Validate(UsernameValidator)

username: string;

// 其他属性...

}

最后,我们可以在控制器中使用 DTO 类来验证用户输入的数据。当用户输入的用户名已经存在时,验证将失败,并返回相应的错误信息。

import { Controller, Post, Body } from '@nestJS/common';

import { RegisterUserDto } from './register-user.dto';

@Controller('users')

export class UsersController {

@Post()

registerUser(@Body() registerUserDto: RegisterUserDto) {

// 验证用户输入的数据

// 如果验证失败,将抛出一个 BadRequestException 异常

}

}

使用自定义验证器是 NestJS 中处理输入验证的一种强大方式。通过自定义验证器,我们可以自定义验证规则,并且可以在验证过程中获得请求实例或执行上下文的信息。在本文中,我们探讨了如何在自定义验证器中获取请求实例或执行上下文,并提供了一个案例代码来演示该过程。希望本文对您在 NestJS 中使用自定义验证器有所帮助。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号