返回

NestJS 7.x 折腾记: 管道,一个好玩的东西!比如入参校验!

前端

管道:处理 NestJS 中的入参数据

在 NestJS 的世界中,“管道”是一个强大的工具,它允许您拦截和转换传入请求中的数据。这些管道类似于管道系统中的过滤器,可以对数据进行各种操作,包括类型转换、验证和加密。

管道的作用

管道在 NestJS 中扮演着至关重要的角色,它们可以:

  • 数据类型转换: 将数据从一种类型转换为另一种类型,例如字符串到数字或 JSON 到对象。
  • 数据验证: 确保数据满足特定条件,例如非空、特定格式或符合模式。
  • 数据加密: 保护敏感数据在传输过程中的安全性。
  • 数据解密: 在控制器方法中使用之前解密加密数据。

使用管道进行入参校验

管道尤其擅长进行入参校验。为了使用管道进行校验,您需要创建一个管道类并实现 PipeTransform 接口。在 transform 方法中,您可以对数据进行校验,如果校验失败,则抛出异常。

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class NameValidationPipe implements PipeTransform {
  transform(value: string, metadata: ArgumentMetadata) {
    if (!value) {
      throw new BadRequestException('Name is required');
    }

    if (value.length < 3) {
      throw new BadRequestException('Name must be at least 3 characters long');
    }

    return value;
  }
}

在上面的示例中,NameValidationPipe 校验入参字符串的非空性和最小长度。

应用管道

要应用管道,请使用 @UsePipes 装饰器,并将管道类作为参数传递给它。您可以在控制器方法或参数级别应用管道:

控制器方法:

@Controller('users')
export class UsersController {
  @UsePipes(NameValidationPipe)
  @Get(':id')
  getUser(@Param('id') id: string) {
    // ...
  }
}

参数级别:

@Controller('users')
export class UsersController {
  @Get(':id')
  getUser(@Param('id', new NameValidationPipe()) id: string) {
    // ...
  }
}

结论

管道是 NestJS 中强大的工具,可以增强您对入参数据的控制。通过使用管道进行入参校验,您可以确保数据满足您的要求,从而提高应用程序的鲁棒性和可靠性。

常见问题解答

  1. 什么是 NestJS 中的管道?
    管道是用于拦截和转换入参数据的机制,可以用于类型转换、验证、加密和解密。

  2. 如何创建管道?
    创建管道需要创建一个管道类并实现 PipeTransform 接口。

  3. 如何使用管道进行入参校验?
    在管道类的 transform 方法中,对数据进行校验并根据校验结果返回数据或抛出异常。

  4. 如何应用管道?
    使用 @UsePipes 装饰器,将管道类作为参数传递给它,可以应用在控制器方法或参数级别。

  5. 管道有哪些好处?
    管道的好处包括增强数据类型控制、提高入参数据质量和简化控制器逻辑。