推荐答案
在 Nest.js 中,@Param 装饰器用于从路由参数中提取值,并将其传递给控制器方法。以下是一个简单的示例:
// www.javascriptcn.com code example
import { Controller, Get, Param } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get(':id')
findOne(@Param('id') id: string): string {
return `User ID: ${id}`;
}
}在这个示例中,@Param('id') 从路由参数中提取 id 的值,并将其传递给 findOne 方法。
本题详细解读
1. @Param 装饰器的基本用法
@Param 装饰器用于从路由参数中提取值。它通常用于处理动态路由,例如 /users/:id。在控制器方法中,你可以使用 @Param 来获取这些动态参数的值。
@Get(':id')
findOne(@Param('id') id: string): string {
return `User ID: ${id}`;
}在这个例子中,@Param('id') 提取了路由中的 id 参数,并将其传递给 findOne 方法。
2. 提取多个参数
如果你需要从路由中提取多个参数,可以使用 @Param() 而不带参数名。这将返回一个包含所有路由参数的对象。
@Get(':id/:name')
findUser(@Param() params: { id: string, name: string }): string {
return `User ID: ${params.id}, User Name: ${params.name}`;
}在这个例子中,@Param() 返回一个包含 id 和 name 的对象,你可以通过 params.id 和 params.name 来访问这些值。
3. 参数类型转换
默认情况下,@Param 提取的参数是字符串类型。如果你需要将参数转换为其他类型(如数字),可以在方法内部进行转换。
@Get(':id')
findOne(@Param('id') id: string): string {
const userId = parseInt(id, 10);
return `User ID: ${userId}`;
}在这个例子中,id 被转换为数字类型。
4. 使用 DTO 进行参数验证
在某些情况下,你可能希望对路由参数进行验证。你可以使用 DTO(Data Transfer Object)来实现这一点。
// www.javascriptcn.com code example
import { Controller, Get, Param, ValidationPipe } from '@nestjs/common';
import { IsNumberString } from 'class-validator';
class UserIdDto {
@IsNumberString()
id: string;
}
@Controller('users')
export class UsersController {
@Get(':id')
findOne(@Param(ValidationPipe) params: UserIdDto): string {
return `User ID: ${params.id}`;
}
}在这个例子中,UserIdDto 类定义了一个 id 属性,并使用 @IsNumberString() 装饰器来确保 id 是一个数字字符串。ValidationPipe 用于验证参数是否符合 DTO 的定义。
5. 总结
@Param 装饰器是 Nest.js 中处理路由参数的重要工具。它可以帮助你轻松地从路由中提取参数,并将其传递给控制器方法。通过结合 DTO 和验证管道,你还可以对参数进行验证和类型转换,从而提高代码的健壮性和可维护性。