推荐答案
在 Nest.js 中,可以通过 @Query()
装饰器来获取查询参数。以下是一个简单的示例:
-- -------------------- ---- ------- ------ - ----------- ---- ----- - ---- ----------------- -------------------- ------ ----- --------------- - ------ ---------------- ------ ---- - ------ ------- -------------------------- - -
在这个示例中,@Query()
装饰器用于获取所有的查询参数,并将其作为一个对象传递给 findAll
方法。
本题详细解读
1. @Query()
装饰器的作用
@Query()
装饰器用于从请求的 URL 中提取查询参数。它可以将查询参数作为一个对象传递给控制器的方法。例如,对于 URL /users?name=John&age=30
,@Query()
会返回一个对象 { name: 'John', age: '30' }
。
2. 获取单个查询参数
如果你只需要获取特定的查询参数,可以将参数名作为 @Query()
的参数传递:
@Get() findOne(@Query('name') name: string) { return `查询的 name 参数为: ${name}`; }
在这个示例中,@Query('name')
只会提取 name
参数的值。
3. 查询参数的类型转换
默认情况下,查询参数的类型是字符串。如果你需要将查询参数转换为其他类型(如数字、布尔值等),可以在方法内部进行类型转换:
@Get() findOne(@Query('age') age: string) { const ageNumber = parseInt(age, 10); return `查询的 age 参数为: ${ageNumber}`; }
4. 查询参数的验证
Nest.js 提供了强大的验证机制,可以通过 class-validator
和 class-transformer
库来验证查询参数。首先,你需要定义一个 DTO(Data Transfer Object)类:
-- -------------------- ---- ------- ------ - --------- -------- - ---- ------------------ ------ ----- ------------ - ----------- ----- ------- ----------- ---- ------- -
然后,在控制器中使用这个 DTO 类来验证查询参数:
@Get() findAll(@Query() query: UserQueryDto) { return `查询参数为: ${JSON.stringify(query)}`; }
5. 处理缺失的查询参数
如果某些查询参数是可选的,你可以在 DTO 类中使用 @IsOptional()
装饰器来标记它们:
-- -------------------- ---- ------- ------ - --------- ----------- -------- - ---- ------------------ ------ ----- ------------ - ------------- ----------- ----- ------- ------------- ----------- ---- ------- -
这样,即使 name
或 age
参数没有提供,也不会触发验证错误。
6. 查询参数的默认值
你可以在控制器方法中为查询参数设置默认值:
@Get() findAll(@Query('name') name: string = 'Guest') { return `查询的 name 参数为: ${name}`; }
在这个示例中,如果 name
参数没有提供,它将默认为 'Guest'
。
7. 处理多个查询参数
如果你需要处理多个查询参数,可以将它们作为对象的属性传递给 @Query()
装饰器:
@Get() findAll(@Query('name') name: string, @Query('age') age: string) { return `查询的 name 参数为: ${name}, age 参数为: ${age}`; }
或者,你可以直接使用 @Query()
获取所有查询参数:
@Get() findAll(@Query() query: any) { return `查询参数为: ${JSON.stringify(query)}`; }
8. 查询参数的编码
在处理查询参数时,需要注意 URL 编码问题。Nest.js 会自动解码查询参数,因此你不需要手动解码。例如,对于 URL /users?name=John%20Doe
,@Query('name')
会返回 'John Doe'
。
9. 查询参数的排序和分页
在处理分页或排序时,查询参数通常用于传递页码、每页大小、排序字段等信息。你可以将这些参数提取出来并进行处理:
@Get() findAll( @Query('page') page: number = 1, @Query('limit') limit: number = 10, @Query('sort') sort: string = 'asc', ) { return `页码: ${page}, 每页大小: ${limit}, 排序: ${sort}`; }
10. 查询参数的缓存
在某些情况下,你可能希望缓存查询参数的结果。Nest.js 提供了缓存机制,可以通过 CacheModule
来实现:
-- -------------------- ---- ------- ------ - ------------ ----------- ---- ----- - ---- ----------------- ------ - ---------------- - ---- ----------------- ------ - --------------- - ---- ----------------- -------------------- ---------------------------------- ------ ----- --------------- - ------ ---------------- ------ ---- - ------ ------- -------------------------- - -
在这个示例中,CacheInterceptor
会自动缓存 findAll
方法的结果,并在下次请求相同的查询参数时返回缓存的结果。