繁体   English   中英

依赖注入到nestjs mixin

[英]Dependency injection into nestjs mixin

我正在尝试创建一个接受参数并使用全局服务( prismaService )的警卫。

依赖注入对普通守卫按预期工作,但要创建一个接受参数的守卫,我正在使用 mixins。

export const UserGuard = (table: Prisma.ModelName, field: string) => {
  class RoleGuardMixin implements CanActivate {
    constructor(prismaService: PrismaService) {}

    async canActivate(context: ExecutionContext) {
      const subject = await this.prismaService[table];
      return true;
    }
  }

  const guard = mixin(RoleGuardMixin);
  return guard;
};

在这种情况下,找不到 PrismaService (我相信因为 mixin 是一个纯 function 返回一个类)。 有没有办法让nestjs在调用后卫后注入PrismaService? 可以将服务注入到类中吗?

你错过了@Injectable()注释:

export const UserGuard = (table: Prisma.ModelName, field: string) => {
  @Injectable() // <<<<<<<
  class RoleGuardMixin implements CanActivate {
    constructor(private prismaService: PrismaService) {}
    //          ^ or 'public' or 'protected'

    async canActivate(context: ExecutionContext) {
      const subject = await this.prismaService[table];
      return true;
    }
  }

  const guard = mixin(RoleGuardMixin);
  return guard;
};

或者,使用@Inject()

export const UserGuard = (table: Prisma.ModelName, field: string) => {
  class RoleGuardMixin implements CanActivate {
    constructor(@Inject(PrismaService) private prismaService: PrismaService) {}

    async canActivate(context: ExecutionContext) {
      const subject = await this.prismaService[table];
      return true;
    }
  }

  const guard = mixin(RoleGuardMixin);
  return guard;
};

感谢@Micael 的回答。

需要的是用@Injectable装饰器来装饰RoleGuardMixin

export const UserGuard = (table: any, field: string) => {
  @Injectable()
  class RoleGuardMixin implements CanActivate {
    constructor(public prismaService: PrismaService) {}

    async canActivate(context: ExecutionContext): Promise<boolean> {
      const request = context.switchToHttp().getRequest();
      const subject = this.prismaService[table].findUnique({
        where: { id: request.params.id }
        });
      return request.user.id === subject[field];
  }

  const guard = mixin(RoleGuardMixin);
  return guard;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM