javascript - NestJS - 当前身份验证用户但不通过装饰器

标签 javascript typescript authentication nestjs

我创建下面的装饰器来获取当前登录的系统用户,

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/

相关文章:

javascript - 如何获取包含所有重音字母、数字但不含 ".,;"和其他标点符号的主题标签

typescript - 如何正确获取对 ControlValueAccessor 中主机指令的引用?

objective-c - 将字符串值传递给要进行身份验证的网站 iOS

javascript - 将 .val() 转换为字符串 jQuery

javascript - 使用 PHP 从数据库检索值、存储在输入文本和文本区域中、更改、将新值传递给数据库?

Javascript:意外的 token 非法

javascript - 使用 Javascript/Typescript 防止 html 注入(inject)

javascript - 如何在不获取 ExpressionChangedAfterItHasBeenCheckedError 的情况下对子组件中的 Material 输入使用 ngIf

python 谷歌应用引擎 : Webapp2 : Authentication

java - 如何覆盖 glassfish 中的 j_security_check?