现在我们要去定义回复评论用的接口,先定义一下这个接口需要的处理器,把它放在 comment.controller 这个文件里,在文件顶部把刚才定义的 isReplyComment 从 comment.service 里面导入进来。接口处理器会用到这个函数提供的功能。
找个地方定义一下回复评论接口的处理器,名字是 reply,在这个处理器里面,先准备一下需要用的数据,在请求的地址参数里面,把 commentId 解构出来,地址参数都在 request.params 里面。一会儿设计回复评论接口的时候,我们会在地址里加入 commentId 这个参数。
这个 commentId 的值就是要回复的评论的 ID,也就是它要作为回复评论数据里的 parentId 这个栏目的值,下面声明一个 parentId,它的值用一下 parseInt 处理一下 commentId,把它转换成十进制的数字。
然后准备一下评论作者的 id,从 request.user 里面,把 id 解构出来,重新起个名字叫 userId。
下面再准备一下评论的内容还有评论所属的内容的 id,它们都应该包含在请求的主体里面,从请求主体里面,把 content 还有 postId 解构出来。请求的主体数据就是 request.body 。
再组织一个评论数据,声明一个 comment,它的值是个对象,里面有 content,postId,userId 还有 parentId,这些属性对应的值在上面我们已经准备好了,值跟属性的名字是一样的,所以这里可以使用这种简单的写法。
因为我不想让评论回复有很多级别,只允许一个级别的回复,也就是如果一个评论已经是另的评论的回复了,那这条评论就不能再被回复了。就是如果评论的 parentId 栏目有值,我们就不允许再回复这条评论了。
用一组 try,catch ,在 try 里面,声明一个 reply,等于 await,用一下之前定义好的 isReplyComment,检查一下要回复的这条评论的 parentId 有没有值。
如果有,if reply ,就 return next ,新建一个错误,错误信息是 UNABLE_TO_REPLY_THIS_COMMENT,这个错误会交给应用默认的异常处理器处理。
执行检查如果出了什么问题会跳转到执行 catch 区块里的代码,这里可以执行 return next,带着 error。
复制一下这个错误信息。找到应用默认的异常处理器,打开 app/app.middleware,修改一下 defaultErrorHandler,在这里可以添加一种新的错误情况。如果错误信息是这个 UNABLE_TO_REPLY_THIS_COMMENT,可以把响应的状态码设置成 400,响应的信息设置成无法回复这条评论。
回来继续编辑回复评论接口的处理器,现在可以把评论数据送进数据仓库里了,用一组 try,catch, 在 try 区块里要保存回复评论,添加一个 data ,等于 await,执行一下 createComment 这个函数,把要保存的评论数据交给这个函数,这里就是 comment。
下面再给客户端做出一个响应,用 response.stauts 把响应的状态码设置成 201,然后用 send 把 data 发给客户端。
在 catch 区块里,执行一下 next() 带着 error。
打开 comment.router ,在这里找个地方定义一下回复评论接口,用一下 router.post 方法定义这个接口,接口地址设置成 /comments/:commentId/reply,在接口上安排一个 authGuard 中间件,接口处理器设置成 commentController 里的 reply 这个方法。