Nestjs验证

NestJs仿小米商城项目实战视频教程(视频+课件+源码) https://www.itying.com/goods-1139.html


Nestjs验证

验证是任何现有Web应用程序的基本功能。为了自动验证传入请求,Nest提供了一个内置的ValidationPipe,它使用了功能强大的class-validator包及其声明性验证装饰器。ValidationPipe提供了一种对所有传入的客户端有效负载强制执行验证规则的便捷方法,其中在每个模块的本地类/DTO声明中使用简单的注释声明特定的规则。

概览

Pipes 一章中,我们完成了构建简化验证管道的过程。为了更好地了解我们在幕后所做的工作,我们强烈建议您阅读本文。在这里,我们将重点讨论ValidationPipe的各种实际用例,并使用它的一些高级定制特性。

自动验证

为了本教程的目的,我们将绑定ValidationPipe到整个应用程序,因此,将自动保护所有接口免受不正确的数据的影响。

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

要测试我们的管道,让我们创建一个基本接口。

@Post()
create(@Body() createUserDto: CreateUserDto) {
  return 'This action adds a new user';
}

现在我们可以在CreateUserDto中添加一些验证规则。我们使用class-validator包提供的装饰器来实现这一点,这里有详细的描述。以这种方式,任何使用CreateUserDto的路由都将自动执行这些验证规则。

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

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsNotEmpty()
  password: string;
}

有了这些规则,当某人使用无效 email 执行对我们的接口的请求时,则应用程序将自动以400 Bad Request代码以及以下响应正文进行响应:

{
  "statusCode": 400,
  "error": "Bad Request",
  "message": [
    {
      "target": {},
      "property": "email",
      "children": [],
      "constraints": {
        "isEmail": "email must be an email"
      }
    }
  ]
}

除了验证请求主体之外,ValidationPipe还可以与其他请求对象属性一起使用。假设我们希望接受端点路径中的id。为了确保此请求参数只接受数字,我们可以使用以下结构:

@Get(':id')
findOne(@Param() params: FindOneParams) {
  return 'This action returns a user';
}

与DTO一样,FindOneParams只是一个使用class-validator定义验证规则的类。它是这样的:

import { IsNumberString } from 'class-validator';

export class FindOneParams {
  @IsNumberString()
  id: number;
}

禁用详细错误

错误消息有助于解释请求中的错误。然而,一些生产环境倾向于禁用详细的错误。通过向ValidationPipe传递一个options对象来做到这一点:

app.useGlobalPipes(
  new ValidationPipe({
    disableErrorMessages: true,
  })
);

现在,不会将错误消息返回给最终用户。

剥离属性

我们的ValidationPipe还可以过滤掉方法处理程序不应该接收的属性。在这种情况下,我们可以对可接受的属性进行白名单,白名单中不包含的任何属性都会自动从结果对象中删除。例如,如果我们的处理程序需要email和password,但是一个请求还包含一个age属性,那么这个属性可以从结果DTO中自动删除。要启用这种行为,请将白名单设置为true。

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
  })
);

当设置为true时,这将自动删除非白名单属性(在验证类中没有任何修饰符的属性)。

或者,您可以在出现非白名单属性时停止处理请求,并向用户返回错误响应。要启用此选项,请将forbidNonWhitelisted选项属性设置为true,并将白名单设置为true。

自动有效负载转换

来自网络的有效负载是普通的JavaScript对象。ValidationPipe可以根据对象的DTO类自动将有效负载转换为对象类型。若要启用自动转换,请将转换设置为true。

app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  })
);

Websockets和 微服务

尽管本章展示了使用HTTP风格的应用程序的例子(例如,Express或Fastify),ValidationPipe对于WebSockets和微服务是一样的,不管使用什么传输方法。

学到更多

要阅读有关自定义验证器,错误消息和可用装饰器的更多信息,请访问此页面