我创建下面的装饰器来获取当前登录的系统用户,
export const CurrentUser = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
但我不想使用它,因为我需要在我的任何 Controller 中使用 这对我来说有点麻烦,因为有些功能是可选的,即对于登录用户和非登录用户来说,
那么,当我想获取当前用户而不是通过 Controller 中的装饰器获取所有用户时,如何在函数中获取当前登录的用户?
感谢您的帮助
最佳答案
您必须创建一个自定义提供程序并将请求注入(inject)其中。像这样的事情
{
provider: 'CURRENT_USER',
inject: [REQUEST],
useFactory: (req: Request) => {
return req.user;
},
scope: Scope.REQUEST,
}
(REQUEST
是从 @nestjs/core
注入(inject)的)
然后可以使用@Inject('CURRENT_USER')
将用户注入(inject)到服务中。请记住,这将使服务 REQUEST
范围化,并通过 scope hierarchy它将使您将服务注入(inject)到 REQUEST
范围内。
编辑 2/15/21
此模块的示例可能如下所示:
@Module({
providers: [{
provider: 'CURRENT_USER',
inject: [REQUEST],
useFactory: (req: Request) => {
return req.user;
},
scope: Scope.REQUEST,
}],
exports: ['CURRENT_USER'],
})
export class CurrentUserModule {}
现在在任何具有需要当前用户的服务的模块中
@Module({
imports: [CurrentUserModule],
providers: [ServiceThatNeedsUser],
})
export class ModuleThatNeedsUser {}
在服务中:
@Injectable()
export class ServiceThatNeedsUser {
constructor(@Inject('CURRENT_USER') private readonly user: UserType) {}
// rest of class implementation
}
关于javascript - NestJS - 当前身份验证用户但不通过装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66195542/