You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest.js自定义装饰器如何实现每次请求返回最新id参数?

解决自定义Param装饰器仅执行一次、无法获取最新请求id的问题

问题根源

你当前的自定义装饰器是在类定义初始化阶段执行的(TypeScript装饰器的特性),也就是服务器启动时就完成了元数据收集,所以console.log只会执行一次,完全没有参与到请求处理的生命周期中,自然无法获取每次请求的路由参数。

正确实现方式

要实现和Nest.js原生@Param一样的效果,必须利用Nest官方提供的createParamDecorator工具函数。这个函数创建的装饰器会在每次请求到来时触发,能访问到当前请求的上下文,从而提取最新的路由参数。

完整代码示例

  1. 实现自定义@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;
  },
);
  1. 在控制器中使用
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:42:49