【问题标题】:NestJS - current auth user but not via decoratorNestJS - 当前身份验证用户,但不是通过装饰器
【发布时间】:2021-05-17 14:27:52
【问题描述】:

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

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

但我不想使用它,因为我需要在我的任何控制器中使用 这对我来说有点麻烦,因为有些功能是可选的,即对于登录用户和未登录用户,

那么,当我想获取当前用户而不是全部通过控制器中的装饰器时,如何在我的 service 函数中获取当前登录用户?

感谢您的帮助

【问题讨论】:

  • 通过参数将当前使用从控制器传递到服务。
  • @hoangdv 你读过这个话题吗? -> but I do not want to use this

标签: javascript typescript authentication nestjs


【解决方案1】:

您必须创建一个自定义提供程序并将请求注入其中。像这样的

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

REQUEST是从@nestjs/core注入的)

然后可以使用@Inject('CURRENT_USER') 将用户注入到服务中。请记住,这将使服务REQUEST 作用域,通过scope hierarchy,它将使您将服务注入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
}

【讨论】:

  • 我需要在哪里使用它?我不知道在哪里将这段代码粘贴到模块中?
  • 如果您需要在多个服务中使用此提供程序,我会创建一个模块,在其元数据中声明提供程序并将其导出。然后,您可以在需要自定义提供程序的任何地方导入该模块
  • 我试试这个,我得到一个错误:Argument of type '{ provider: string;注入:字符串[]; useFactory: (req: Request) => any;范围:范围; }' 不可分配给“ModuleMetadata”类型的参数。对象字面量只能指定已知属性,但在“ModuleMetadata”类型中不存在“提供者”。你的意思是写“提供者”吗?ts(2345)
  • 你有什么解决办法吗?
  • 我说要创建一个custom provider。自定义提供程序进入 providers 数组。我没有说将它添加到imports
猜你喜欢
  • 2014-08-25
  • 2015-10-23
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多