6. 管道:Nest.js 的数据处理和验证工具

216 阅读4分钟

6. 管道:Nest.js 的数据处理和验证工具

介绍

欢迎回来!在前几篇文章中,我们已经了解了如何创建控制器、服务和中间件,并使用它们来处理 HTTP 请求。在这篇文章中,我们将探讨 Nest.js 中的管道(Pipes)。管道是处理请求数据转换和验证的强大工具,可以在请求到达控制器之前对数据进行处理。让我们一起深入了解管道的工作原理和使用方法。

什么是管道?

管道是一个类,它实现了 PipeTransform 接口,并包含一个 transform 方法。transform 方法接收两个参数:要处理的值和元数据。管道可以用于数据转换(如将字符串转换为整数)和数据验证(如检查请求体是否包含必需的字段)。

创建一个管道

让我们通过一个实际例子来了解如何创建和使用管道。假设我们要创建一个验证管道,用于验证请求体中的数据。

首先,使用 Nest CLI 创建一个新的管道:

nest generate pipe validation

这条命令会在 src 目录下生成一个 validation.pipe.ts 文件。让我们看看这个文件的内容:

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

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    return value;
  }
}
  • @Injectable():将类标记为可注入的服务。
  • transform 方法:管道的核心方法,接收要处理的值和元数据。

使用管道进行数据验证

让我们修改 ValidationPipe,在 transform 方法中添加数据验证逻辑。假设我们要验证请求体中的 title 字段是否存在。

修改 validation.pipe.ts 文件如下:

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

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (!value.title) {
      throw new BadRequestException('Title is required');
    }
    return value;
  }
}

在这个例子中,我们检查请求体中是否包含 title 字段。如果不存在,我们抛出一个 BadRequestException 异常。

应用管道

要使用管道,我们需要将其应用到特定的路由或全局范围内。让我们将 ValidationPipe 应用到 BooksControllercreate 方法。

打开 books.controller.ts 文件,修改如下:

import { Controller, Get, Post, Put, Delete, Param, Body, UsePipes } from '@nestjs/common';
import { BooksService } from './books.service';
import { CreateBookDto } from './create-book.dto';
import { ValidationPipe } from './validation.pipe';

@Controller('books')
export class BooksController {
  constructor(private readonly booksService: BooksService) {}

  @Get()
  findAll(): string {
    return this.booksService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string): string {
    return this.booksService.findOne(id);
  }

  @Post()
  @UsePipes(ValidationPipe)
  create(@Body() createBookDto: CreateBookDto): string {
    return this.booksService.create(createBookDto);
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateBookDto: CreateBookDto): string {
    return this.booksService.update(id, updateBookDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string): string {
    return this.booksService.remove(id);
  }
}

在这个例子中,我们使用 @UsePipes 装饰器将 ValidationPipe 应用到 create 方法。每次请求到达 create 方法之前,都会先经过 ValidationPipe

全局管道

如果你希望管道应用于所有路由,可以将其注册为全局管道。打开 main.ts 文件,修改如下:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from './validation.pipe';

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

在这个例子中,我们使用 app.useGlobalPipes 方法将 ValidationPipe 注册为全局管道。这样,所有的请求都会经过 ValidationPipe

使用内置管道

Nest.js 提供了一些内置的管道,如 ValidationPipeParseIntPipe。这些内置管道可以帮助我们更方便地进行数据验证和转换。

让我们看看如何使用内置的 ValidationPipe 进行数据验证。首先,安装 class-validatorclass-transformer 包:

npm install class-validator class-transformer

然后,修改 create-book.dto.ts 文件,添加验证装饰器:

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

export class CreateBookDto {
  @IsString()
  @IsNotEmpty()
  title: string;

  @IsString()
  author: string;

  @IsString()
  publishedDate: string;
}

最后,修改 main.ts 文件,使用内置的 ValidationPipe

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

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

在这个例子中,我们使用内置的 ValidationPipe 进行数据验证。每次请求到达控制器之前,都会先经过 ValidationPipe,并根据 DTO 中的验证装饰器进行验证。

结论

在这篇文章中,我们深入探讨了 Nest.js 中的管道,并通过实际例子展示了如何创建和使用管道。我们还学习了如何将管道应用到特定的路由或全局范围内,以及如何使用内置管道进行数据验证和转换。

管道是处理请求数据转换和验证的强大工具,可以在请求到达控制器之前对数据进行处理。通过使用管道,我们可以确保数据的完整性和一致性,使应用更加健壮和可靠。

感谢你的阅读!如果你有任何问题或建议,欢迎在评论区留言。我们下次再见!

预告

在下一篇文章中,我们将探讨 Nest.js 中的异常过滤器(Exception Filters)。异常过滤器是处理应用中异常情况的强大工具,可以捕获和处理异常,并返回自定义的响应。敬请期待!