[英]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.