NestJS 的 createParamDecorator 函数来创建一个自定义的参数装饰器 @CurrentUser。这个装饰器可以用于在你的控制器方法中直接获取当前用户的信息。我将逐步解释这个代码的每个部分:
createParamDecorator 函数
createParamDecorator是 NestJS 提供的一个函数,用于创建自定义的参数装饰器。- 它接受一个回调函数作为参数。这个回调函数有两个参数:
data和context。
回调函数
- data:当你在控制器中使用这个装饰器时,
data参数允许你传递额外的信息给装饰器。例如,如果你使用@CurrentUser('id'),那么 'id' 就会作为data参数的值传递给回调函数。 - context:
context是一个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() 装饰器会自动提取并传递当前用户的信息。