在应用里我们可以定义一些 Saga,进一步处理在应用里发生的一连串的事件。比如可以创建一个 Saga,监视在应用里发生的用户已被创建事件,发生这个事件以后,可以再触发一个新的命令。
我们先创建一个新的模块,在终端,执行 nest generate module 生成一个模块,名字是 app-notification,放在 app/notification 里面,加上一个 --flat 选项。
然后在这个新模块里再添加一个命令,执行 npm run gc 生成一个命令,名字是 send-message ,放在 app/notification/commands 里面。
回到项目,打开 SendMessageCommand,在它的参数里面添加一个 message 属性,类型是 string。再打开命令的处理器,这里可以简单的控制台上输出 command.params 里的 message 属性的值。
Saga
然后我们再回到终端,这次可以创建一个 Saga,执行 npm run gs 生成一个 Saga ,名字是 user,放在 user/sagas 里面。
回到项目,打开这个 user.saga ,这里已经定义了一个 Saga,方法的名字可以改一下,比如 sendMessageWhenUserCreated 。
Saga 处理器都接收一个事件流参数,这里我们给这个事件流接上一个管道,然后在这个管道里可以使用一些操作员方法处理事件流里的事件,这里用了一个 ofType ,可以筛选出 UserCreatedEvent 这个类型的事件。
下面又用了一个 map ,提供的回调参数里面有个 event 参数,它是一个 UserCreatedEvent ,这里可以返回一个新的命令,新建一个 SendMessageCommand,提供一个参数,里面有个 message 属性,值可以是 welcome 后面加上 ${event.params.name} 。
测试
在 Http 客户端,发送一下这个创建用户请求。然后在运行项目的终端这里观察一下,你会发现输出了一行 welcome 王皓。
在 UserSaga 里面,有个 Saga 会监视应用里发生的 UserCreatedEvent 事件,发生这个事件它会触发一个新的命令,也就是 SendMessageCommand ,这个命令的处理器做的事情就是在控制台上输出这样一行文字。