参数装饰器

164 阅读2分钟

NestJS 的 createParamDecorator 函数来创建一个自定义的参数装饰器 @CurrentUser。这个装饰器可以用于在你的控制器方法中直接获取当前用户的信息。我将逐步解释这个代码的每个部分:

createParamDecorator 函数

  • createParamDecorator 是 NestJS 提供的一个函数,用于创建自定义的参数装饰器。
  • 它接受一个回调函数作为参数。这个回调函数有两个参数:datacontext

回调函数

  • data:当你在控制器中使用这个装饰器时,data 参数允许你传递额外的信息给装饰器。例如,如果你使用 @CurrentUser('id'),那么 'id' 就会作为 data 参数的值传递给回调函数。
  • contextcontext 是一个 ExecutionContext 实例,它提供了当前请求的详细上下文信息。通过 context,你可以访问当前的请求对象、响应对象、当前路由的细节等。

自定义装饰器的功能

  • 自定义装饰器的主要目的通常是简化某些常见操作。在这个例子中,假设你想要在多个控制器方法中轻松地访问当前用户的信息。你可能会通过 context 对象来获取这些信息,并通过这个装饰器返回给控制器方法。

完成装饰器

目前,回调函数的内部是空的。为了使这个装饰器工作,你需要在回调函数中添加逻辑来提取和返回当前用户的信息。例如,如果你使用 Passport.js 进行身份验证,当前用户的信息通常存储在 request 对象的 user 属性中:

typescriptCopy code
export const CurrentUser = createParamDecorator(
  (data: any, context: ExecutionContext) => {
    const request = context.switchToHttp().getRequest();
    return data ? request.user[data] : request.user;
  },
);

使用装饰器

在你的控制器中,你可以这样使用这个装饰器:

typescriptCopy code
@Controller('some-route')
export class SomeController {
  @Get()
  someMethod(@CurrentUser() user) {
    console.log(user); // 当前用户的信息
  }
}

在这个例子中,每当 someMethod 被调用时,@CurrentUser() 装饰器会自动提取并传递当前用户的信息。