乐闻世界logo
搜索文章和话题

How validate query params in nestjs

4 个月前提问
3 个月前修改
浏览次数51

1个答案

1

NestJS 采用强大的管道(Pipes)概念来处理验证逻辑,它允许你以声明式的方式应用验证规则。对于验证查询参数(query parameters),通常使用类验证器(class-validator)和转换器(class-transformer)库,这使得能够通过数据传输对象(Data Transfer Objects, DTOs)来指定验证规则。

以下是使用 NestJS 验证查询参数的步骤示例:

步骤 1: 安装必要的包

首先,需要安装 class-validatorclass-transformer 包,如果尚未安装,可以使用以下命令:

bash
npm install class-validator class-transformer

步骤 2: 创建 DTO 并添加验证规则

接下来,创建一个 DTO,该 DTO 用于定义和验证查询参数。你可以使用 class-validator 提供的装饰器来添加验证规则。

typescript
import { IsInt, IsOptional, IsString, Min } from 'class-validator'; export class GetItemsQueryDto { @IsOptional() @IsString() search?: string; @IsOptional() @IsInt() @Min(0) skip?: number; @IsOptional() @IsInt() @Min(1) limit?: number; }

在这个例子中,我们定义了三个可选的查询参数:search(字符串类型),skip(整数类型,必须大于或等于0),和 limit(整数类型,必须大于1)。

步骤 3: 应用 DTO 到请求处理函数

在你的控制器中,你可以使用 @Query() 装饰器来自动应用 DTO,并触发验证逻辑。

typescript
import { Controller, Get, Query, UsePipes, ValidationPipe } from '@nestjs/common'; @Controller('items') export class ItemsController { @Get() @UsePipes(new ValidationPipe({ transform: true })) getItems(@Query() query: GetItemsQueryDto) { // 在这里,query 已经是验证过的对象 // 你可以安全地使用 query.search, query.skip, 和 query.limit // ... } }

@UsePipes(new ValidationPipe({ transform: true })) 装饰器中,transform: true 选项会确保请求中的查询参数转换成 DTO 定义的数据类型,而且执行验证。

如果查询参数无效,NestJS 将自动返回 400 (Bad Request) 响应,并且提供详细的错误信息,这样前端开发者可以清楚地知道哪些参数不符合要求。

示例

假设我们有一个获取商品列表的接口,该接口接受 search(用于模糊查询商品名称),skiplimit(用于分页)查询参数。使用上述的 DTO 和控制器配置,如果用户发送了 GET /items?search=phone&skip=-1&limit=5 这样的请求,NestJS 将返回 400 响应并且提示 skip 参数必须大于或等于0。

以上就是如何在 NestJS 中验证查询参数的过程。利用 NestJS 的管道和类验证器,我们可以轻松地为任何路由添加复杂的验证逻辑。

2024年6月29日 12:07 回复

你的答案