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

推荐答案

在 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-validatorclass-transformer 库来验证查询参数。首先,你需要定义一个 DTO(Data Transfer Object)类:

-- -------------------- ---- -------
------ - --------- -------- - ---- ------------------

------ ----- ------------ -
  -----------
  ----- -------

  -----------
  ---- -------
-

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

5. 处理缺失的查询参数

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

-- -------------------- ---- -------
------ - --------- ----------- -------- - ---- ------------------

------ ----- ------------ -
  -------------
  -----------
  ----- -------

  -------------
  -----------
  ---- -------
-

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

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 方法的结果,并在下次请求相同的查询参数时返回缓存的结果。

纠错
反馈