定义一个更新内容用的接口。在终端项目所在目录的下面,执行 nest generate controller ,生成一个控制器,名字是 post-update ,放在 post/modules/update/controllers 里面,加上一个 --flat 选项。然后生成一个类,执行 nest generate class 名字是 update-post.dto ,放在 post/modules/update/dtos 里面。
再生成一个更新内容用的命令,执行 npm run gc 名字是 update-post,放在 post/modules/update/commands 里面。然后再给项目安装一个包,执行 npm install @nestjs/mapped-types。
回到项目,打开 UpdatePostDto,添加一个 extends,然后用一下 PartialType ,这个东西来自刚才安装的 @nestjs/mapped-types 这个包,给它提供一个 CreatePostDto。这样这个 UpdatePostDto 里面就会包含 CreatePostDto 里的属性,同时这些属性会变成可选的。
更新内容命令
打开 UpdatePostCommand ,设置一下命令参数,让它继承一下 UpdateUserDto,另外再添加一个 id 参数,内容的 id,类型是 number 。
打开命令对应的处理器,在构造方法里注入一个 Repository,实体类型是 PostEntity,名字是 postRepository,再分别导入需要的这些东西。
在 execute 方法里面,解构一下命令参数,需要 id,来自 command.params,return 的值,可以用一下 this.postRepository.update 这个方法,提供一个 id ,再把 command.params 交给这个 update 方法,它会更新指定 id 的 post 数据。
更新内容接口
打开 PostUpdateController ,去掉 Controller 装饰器里的参数,添加一个构造方法,注入一个 CommandBus 依赖。
再定义一个接口,用 @Patch 装饰一下,地址是 posts/:postId,方法的名字是 updatePost。用 @Body 装饰一下 body 参数,类型是 UpdatePostDto。再用 @Param 装饰器,需要 postId 这个地址参数,再用 ParseIntPipe 处理一下,把它转换成数字,参数名字是 postId,类型是 number。
return 的东西是执行 UpdatePostCommand 命令得到的结果,新建一个 UpdatePostCommand 命令,提供一个对象,先把 body 里的东西放进来,再添加一个 id 属性,对应的值是 postId。
我这里提示参数类型有点问题,打开这个 UpdatePostCommand 命令,这个命令参数要继承的是 UpdatePostDto ,不是 UpdateUserDto ,再把上面导入 UpdateUserDto 用的代码删除掉。
测试
然后在 Http 客户端测试一下,复制一份创建内容请求,修改一下名字,设置成更新内容,请求的方法改成 PATCH,请求的地址是 posts ,然后再加上一个要修改的内容的 id。
在请求主体数据里面可以包含要更新的内容,比如可以添加一个 content ,设置一下内容的正文。发送一下这个更新内容请求,成功以后,可以到数据库客户端观察一下。打开 post 数据表,观察一下 id 是 1 的这条数据记录,现在它的 content 字段就有值了。