下面我们可以执行一下刚才定义的 CreateUserCommand 命令,需要用到一个 CommandBus 去做这个事,执行命令可以直接在控制器里去做,也可以交给一个服务去做。我打算先直接在这个控制器里去执行命令。要在这个类里注入 CommandBus。
先打开 UserModule 模块,然后在这个模块的 imports 里面,添加一个 CqrsModule,需要注入的 CommandBus 是这个模块导出的功能。
打开 UserController,在类里面添加一个构造方法,constructor ,在这个方法里,注入一个依赖,添加一个参数属性,private readonly 名字叫 commandBus,它的类型要设置成 CommandBus,这个 CommandBus 来自 @nestjs/cqrs。
然后在控制器里添加一个方法,方法的名字是 createUser,在这个方法的上面,用 @Post 装饰器装饰一下,这个 Post 来自 @nestjs/common 。
这样在客户端那里用 Http 的 POST 方法请求 users 这个地址的时候,就会执行这个控制器里的 createUser 方法。要做的事情就是去创建一个新的用户。
请求里带的数据可以交给这个方法的一个参数,用 @Body 装饰一下这个参数,名字可以是 user,类型暂时设置成 any 。
执行命令
之前我们在控制器里用的都是服务上的一个方法,这次我们要做的是去执行一个命令,return 的是,用一下 this.commandBus 上的 execute ,去执行一个命令。 新建一个 CreateUserCommand,把 user 放进来。
预览
打开一个 Http 客户端,配置一个请求,请求用的 Http 方法设置成 POST,请求的地址是 localhost:3000/users。
请求里带着一个 JSON 格式的数据,里面添加一个 "name" 设置一下它的值,比如 wanghao 。 再发送一下这个请求。服务端响应回来一个 500 的错误。
错误
回到运行项目开发服务的终端观察一下,这里会提示说,没找到 CommandHandler,就是命令处理器。请求接口执行了 CreateUserCommand 命令。
我们之前给这个命令定义了一个命令的处理器,不过这里并没有把这个处理器跟指定的命令连接到一块儿,把它们关联在一起,需要在命令处理器的上面,用一下 @CommandHandler 装饰器,把这个处理器要处理的命令交给这个装饰器,这里就是 CreateUserCommand 命令。
测试
回到客户端,重新发送一下这个请求,得到的响应是一个用户。
处理这个请求,用的是 UserModule 模块里的 UserController 这个控制器上的 createUser 方法。
在这个方法里,现在用了 commandBus 执行了一个 CreateUserCommand 命令,这个命令的处理器是 CreateUserCommandHandler,在它的 execute 方法里面,要做的事情,就是在控制台输出这个 command ,然后返回 command 里的 user。
在运行项目开发服务的终端,会输出一个 CreateUserCommand 。