推荐答案
在 Nest.js 中,可以通过 @Query() 装饰器来获取查询参数。以下是一个简单的示例:
// www.javascriptcn.com code example
import { Controller, Get, Query } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll(@Query() query: any) {
return `查询参数为: ${JSON.stringify(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)类:
// www.javascriptcn.com code example
import { IsNumber, IsString } from 'class-validator';
export class UserQueryDto {
@IsString()
name: string;
@IsNumber()
age: number;
}然后,在控制器中使用这个 DTO 类来验证查询参数:
@Get()
findAll(@Query() query: UserQueryDto) {
return `查询参数为: ${JSON.stringify(query)}`;
}5. 处理缺失的查询参数
如果某些查询参数是可选的,你可以在 DTO 类中使用 @IsOptional() 装饰器来标记它们:
// www.javascriptcn.com code example
import { IsNumber, IsOptional, IsString } from 'class-validator';
export class UserQueryDto {
@IsOptional()
@IsString()
name: string;
@IsOptional()
@IsNumber()
age: number;
}这样,即使 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 来实现:
// www.javascriptcn.com code example
import { CacheModule, Controller, Get, Query } from '@nestjs/common';
import { CacheInterceptor } from '@nestjs/common';
import { UseInterceptors } from '@nestjs/common';
@Controller('users')
@UseInterceptors(CacheInterceptor)
export class UsersController {
@Get()
findAll(@Query() query: any) {
return `查询参数为: ${JSON.stringify(query)}`;
}
}在这个示例中,CacheInterceptor 会自动缓存 findAll 方法的结果,并在下次请求相同的查询参数时返回缓存的结果。