NestJS如何对数组类型查询参数应用ParseUUIDPipe验证管道
NestJS 数组类型查询参数应用ParseUUIDPipe校验方案
问题场景
使用NestJS实现HTTP接口时,需要通过查询参数接收一组UUID值,初始写法如下:
@Get('test') test( @Query('id', ParseArrayPipe, ParseUUIDPipe) id: string[], ) { // 业务逻辑 }
使用如下请求测试:
curl localhost/test?id=3b717319-e2c1-4807-a950-28b187661fe3&id=04500ae4-81b0-49ba-83f1-f9b69908f3ba
传入多个查询参数时,请求被直接拒绝,返回400错误:
{ "statusCode":400, "message":"The value passed as UUID is not a string", "error":"Bad Request" }
需要实现的效果:管道校验数组内的每个字符串元素是否为合法UUID,而非将整个数组作为单值校验。
错误原因
@Query装饰器中平级传入的管道是串行执行的,前一个管道的输出会作为后一个管道的输入:
- 首先执行
ParseArrayPipe,将重复的id参数解析为字符串数组 - 随后将整个数组传入
ParseUUIDPipe,但ParseUUIDPipe的预期输入是字符串类型,接收到数组后直接抛出类型错误。
正确实现
将ParseUUIDPipe作为ParseArrayPipe的items配置项传入,由ParseArrayPipe负责对数组的每个元素逐个执行UUID校验,修正后的代码如下:
import { Controller, Get, Query, ParseArrayPipe, ParseUUIDPipe } from '@nestjs/common'; @Controller() export class TestController { @Get('test') test( @Query('id', new ParseArrayPipe({ items: ParseUUIDPipe, // 对数组每个元素应用ParseUUIDPipe校验 // 可选配置:要求数组至少包含1个元素 // minLength: 1, // 可选配置:自定义数组分隔符,默认为逗号,同时支持重复key传参形式 // separator: ',' })) id: string[], ) { // 此处拿到的id数组中所有元素均为校验通过的合法UUID return { receivedIds: id }; } }
该写法同时支持两种数组传参格式:
- 重复key形式:
?id=uuid1&id=uuid2 - 逗号分隔形式:
?id=uuid1,uuid2
如果传入的元素存在非法UUID,会返回对应位置元素校验失败的明确错误提示。
内容的提问来源于stack exchange,提问作者Aki
相关产品推荐
相关产品推荐

