在应用里面发生的事情,可以定义一些事件,事件可以有对应的事件处理器。比如应用执行了创建用户的命令以后,可以发布一个用户已经创建了的事件,这样可以继续去处理用户创建以后的事情,比如把这个事件存储起来。
在 src/modules/user 里面,新建一个文件,放在 events 下面,名字是 user-created.event.ts,在这个文件里定义一个事件,定义的这个事件主要就是描述一下这个事件里包含的东西。export 一个 class,名字是 UserCreatedEvent ,在这个类里面添加一个构造方法,constructor,里面添加一个参数属性,public readonly,名字是 user ,一般我们可以去定义一个 User 模型,作为这个 user 的类型。暂时先设置成 any。
处理器
事件可以有一些事件处理器,在这些处理器里可以决定怎么样处理对应的事件。在 events 里面,再添加一个文件,名字是 user-created.event.handler.ts。
事件处理器是个类,可以导出要定义的这个类,export 一个 class,名字是 UserCreatedEventHandler。
事件处理器需要实施一个接口,implements 一下 IEventHandler 这个接口,类型是 UserCreatedEvent ,就是事件的名字。
实施了这个接口以后,需要在类里面添加一个特定的方法,这里就是 handle 这个方法,方法接收一个 event 参数,类型是 UserCreatedEvent。
在这个方法里,可以执行如何处理发生的 UserCreatedEvent 事件。 event 参数的值就是事件里带的具体的数据,这个 UserCreatedEvent 事件里面,会有一个 user 属性,user 的值应该是一个用户。
为了简单,处理这个事件要做的事情,就是在控制台上输出 event 参数的值。
注册
事件处理器是 Provider,需要在模块里配置一下,打开 UserModule 模块,在模块的 providers 里面,添加一个 UserCreatedEventHandler 。
连接
下面我们需要再设置一下,让事件与事件处理器连接到一块儿。让这个处理器处理对应的事件,需要在这个类的上面用一个装饰器,用一下 @EventHandler 装饰器,这个东西来自 @nestjs/cqrs。 把事件交给这个装饰器,UserCreatedEvent,这样这个处理器处理的就是 UserCreatedEvent 这个事件。