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 方法,然后发出事件。
我正在按照 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 方法,然后发出事件。