NestJS 事件发射器

NestJS EventEmitter

我正在按照 NestJS 文档创建 EventEmitter (Doc Link。 当我 运行 我的代码出现错误时:

[Nest] 129586 - 16/06/2021,20:43:31 [ExceptionsHandler] this.eventEmitter.emit 不是函数

我的代码是这样的:

从“@nestjs/event-emitter”导入{EventEmitter2};

@EntityRepository(授权)
导出 class AuthRepository 扩展存储库{


    构造函数(私有事件发射器:EventEmitter2){
        极好的();
    }

    私人记录器=新记录器(AuthRepository.name);

    异步创建用户(authDao:SignUpDto):承诺{

        const { 密码、用户名、角色、电子邮件、出生日期、fname、lname } = authDao;

        让 user = await this.findOne({ username });

        如果(用户){
            抛出新的 ForbiddenException("Username already taken");
        }

        user = this.create({ password, username, role });

        await this.save(user).catch(e => this.logger.error(e));

        this.eventEmitter.emit("user.created", {
            fname, lname, dateOfBirth, 电子邮件
        });


    };


} 

我不确定我在这里遗漏了什么。

Nest 不会在 TypeORM Repository classes 上做任何 DI。这是因为这些 classes 具有 TypeORM 所必需的其他依赖项,例如实体管理器和连接。注入 EventEmitter 应该在常规的 NestJS Provider 中完成,而不是 TypeO Repo class

我要提到的一件事是,您希望声明 class 的行看起来像这样:

export class AuthRepository extends Repository<Auth> {

如下所示:https://docs.nestjs.com/techniques/database#custom-repository

事件发射器没有被正确注入的原因是 Nest 已经在 Repository subclass 的构造函数中注入了其他东西,所以签名不匹配。

更重要的是,这可能被认为是一个糟糕的设计,因为存储库应该只关心实体上的持久性操作。您可能想要重构它,并创建一个服务(提供者),然后将 eventEmitter 和您的存储库注入其中。然后,在该服务中,您可以调用存储库实例上的 createUser 方法,然后发出事件。