Nest.js自定义装饰器如何实现每次请求返回最新id参数?
解决自定义Param装饰器仅执行一次、无法获取最新请求id的问题
问题根源
你当前的自定义装饰器是在类定义初始化阶段执行的(TypeScript装饰器的特性),也就是服务器启动时就完成了元数据收集,所以console.log只会执行一次,完全没有参与到请求处理的生命周期中,自然无法获取每次请求的路由参数。
正确实现方式
要实现和Nest.js原生@Param一样的效果,必须利用Nest官方提供的createParamDecorator工具函数。这个函数创建的装饰器会在每次请求到来时触发,能访问到当前请求的上下文,从而提取最新的路由参数。
完整代码示例
- 实现自定义
@Param装饰器
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const Param = createParamDecorator( (paramName: string | undefined, ctx: ExecutionContext) => { // 从请求上下文获取HTTP请求对象 const request = ctx.switchToHttp().getRequest(); // 每次请求都会执行这里的日志 console.log('当前请求路由参数:', request.params); // 如果指定了参数名,返回对应的值;否则返回整个参数对象 return paramName ? request.params[paramName] : request.params; }, );
- 在控制器中使用
@Get('/:id') async findUser( // 方式1:指定参数名,直接获取id值 @Param('id') id: string, // 方式2:不指定参数名,获取整个参数对象 // @Param() params: { id: string } ): Promise<User> { console.log('本次请求的id:', id); // 业务逻辑... }
关键说明
createParamDecorator接收一个回调函数,该函数会在每次请求处理时被调用,确保能获取到当前请求的最新参数。- 通过
ExecutionContext可以切换到不同的请求类型(HTTP、WebSocket等),这里用switchToHttp()获取HTTP请求对象,进而拿到request.params里的路由参数。 - 如果需要对参数做额外的验证、转换逻辑,可以结合Nest的**管道(Pipe)**一起使用,比如
@Param('id', ParseIntPipe)将id转为数字类型。
内容的提问来源于stack exchange,提问作者user6250381
相关产品推荐
相关产品推荐

