如何在Express.js中创建自定义参数装饰器获取请求中的User
实现NestJS自定义@GetUser参数装饰器获取用户信息
你之前写的基础装饰器仅能标记参数位置,无法直接获取request对象。NestJS提供了createParamDecorator工具函数,专门用来创建可获取请求上下文的参数装饰器,具体实现步骤如下:
1. 编写@GetUser装饰器代码
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const GetUser = createParamDecorator( (data: string | undefined, ctx: ExecutionContext) => { // 从执行上下文获取Express环境的request对象 const request = ctx.switchToHttp().getRequest(); // 若传入字段名则返回user对应字段,否则返回完整user对象 return data ? request.user?.[data] : request.user; }, );
2. 在接口中使用装饰器
直接在方法参数里使用@GetUser即可,还可指定要获取的user字段:
import { Put, Controller } from '@nestjs/common'; import { GetUser } from './your-decorator-path'; @Controller('users') export class UsersController { @Put('/:_id') async update( @GetUser() user: any, // 获取完整user对象 // 也可指定字段:@GetUser('id') userId: string ) { // 直接使用user对象 console.log(user); // ...业务逻辑代码 } }
关键点说明
ExecutionContext是Nest的上下文对象,通过switchToHttp().getRequest()可拿到Express的request实例- 装饰器支持传入可选参数
data,用于直接提取user的某个属性 - 若你的user对象有明确类型,将
any替换为对应类型定义即可,无需@ts-ignore
内容的提问来源于stack exchange,提问作者Ionut Enache
相关产品推荐
相关产品推荐

