0

我正在关注 NestJS 文档来创建 EventEmitter (文档链接。当我运行我的代码时,我遇到了一个错误:

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

这就是我的代码的样子:

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

@EntityRepository(Auth)
导出类 AuthRepository 扩展存储库{


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

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

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

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

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

        如果(用户){
            throw new ForbiddenException("用户名已被占用");
        }

        user = this.create({ 密码,用户名,角色 });

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

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


    };


}

我不确定我在这里缺少什么。

4

2 回答 2

1

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

于 2021-06-16T15:45:47.780 回答
1

我要提到的一件事是,您希望声明类的行如下所示:

export class AuthRepository extends Repository<Auth> {

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

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

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

于 2022-03-04T05:16:50.267 回答