簡體   English   中英

NestJS - 當前身份驗證用戶,但不是通過裝飾器

[英]NestJS - current auth user but not via decorator

我創建了下面的裝飾器來獲取當前登錄到系統用戶,

export const CurrentUser = createParamDecorator(
    (data: unknown, ctx: ExecutionContext) => {
      const request = ctx.switchToHttp().getRequest();
      return request.user;
    },
  );

但我不想使用它,因為我需要在我的任何 controller 中使用這對我來說有點麻煩,因為有些功能是可選的,即對於登錄用戶和未登錄用戶,

那么,當我想獲取當前用戶而不是全部通過 controller 中的裝飾器時,如何在我的service中獲取當前登錄用戶?

謝謝你的幫助

您必須創建一個自定義提供程序並將請求注入其中。 像這樣的東西

{
  provider: 'CURRENT_USER',
  inject: [REQUEST],
  useFactory: (req: Request) => {
    return req.user;
  },
  scope: Scope.REQUEST,
}

REQUEST@nestjs/core注入)

然后可以使用@Inject('CURRENT_USER')將用戶注入到服務中。 請記住,這將使服務REQUEST作用域,並且通過scope 層次結構,它將使您將服務注入到REQUEST作用域中的任何內容。

21 年 2 月 15 日編輯

此模塊的示例可能如下所示:

@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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM