Nest.js 中如何使用查询参数?

· 约 6 分钟读完 · 第 30 / 144 章

推荐答案

在 Nest.js 中,可以通过 @Query() 装饰器来获取查询参数。以下是一个简单的示例:

在这个示例中,@Query() 装饰器用于获取所有的查询参数,并将其作为一个对象传递给 findAll 方法。

本题详细解读

1. @Query() 装饰器的作用

@Query() 装饰器用于从请求的 URL 中提取查询参数。它可以将查询参数作为一个对象传递给控制器的方法。例如,对于 URL /users?name=John&age=30,@Query() 会返回一个对象 { name: 'John', age: '30' }。

2. 获取单个查询参数

如果你只需要获取特定的查询参数,可以将参数名作为 @Query() 的参数传递:

在这个示例中,@Query('name') 只会提取 name 参数的值。

3. 查询参数的类型转换

默认情况下,查询参数的类型是字符串。如果你需要将查询参数转换为其他类型(如数字、布尔值等),可以在方法内部进行类型转换:

4. 查询参数的验证

Nest.js 提供了强大的验证机制,可以通过 class-validator 和 class-transformer 库来验证查询参数。首先,你需要定义一个 DTO(Data Transfer Object)类:

然后,在控制器中使用这个 DTO 类来验证查询参数:

5. 处理缺失的查询参数

如果某些查询参数是可选的,你可以在 DTO 类中使用 @IsOptional() 装饰器来标记它们:

这样,即使 name 或 age 参数没有提供,也不会触发验证错误。

6. 查询参数的默认值

你可以在控制器方法中为查询参数设置默认值:

在这个示例中,如果 name 参数没有提供,它将默认为 'Guest'。

7. 处理多个查询参数

如果你需要处理多个查询参数,可以将它们作为对象的属性传递给 @Query() 装饰器:

或者,你可以直接使用 @Query() 获取所有查询参数:

8. 查询参数的编码

在处理查询参数时,需要注意 URL 编码问题。Nest.js 会自动解码查询参数,因此你不需要手动解码。例如,对于 URL /users?name=John%20Doe,@Query('name') 会返回 'John Doe'。

9. 查询参数的排序和分页

在处理分页或排序时,查询参数通常用于传递页码、每页大小、排序字段等信息。你可以将这些参数提取出来并进行处理:

10. 查询参数的缓存

在某些情况下,你可能希望缓存查询参数的结果。Nest.js 提供了缓存机制,可以通过 CacheModule 来实现:

在这个示例中,CacheInterceptor 会自动缓存 findAll 方法的结果,并在下次请求相同的查询参数时返回缓存的结果。