评论列表需要一个过滤功能,比如过滤出属于某个具体内容的评论列表,或者找出某个用户发布的所有的评论等等。先去创建一个过滤器。
打开 comment.middleware,在这里定义一个要用在评论列表上的过滤器,它是一个中间件,中间件的名字叫 filter。在这个中间件里面,先设置一个默认的过滤。
设置一下 requeset 上的 filter 属性的值,之前在实现内容列表过滤的时候,我们在 request 上面添加了这个 filter 属性。它的值是个对象,里面可以添加一个 name 设置一下这个过滤方法的名字,比如 default ,然后用 sql 设置一下过滤条件的 SQL 语句,这个默认的过滤条件可以是 comment.parentId IS NULL,意思就是过滤掉所有的回复评论。
在中间件里面,要执行一下 next() 继续下一步的处理。
打开 comment.service,找到之前定义的 getComments 函数,现在我们要让这个函数支持一个参数,可以在它的上面先定义一个 interface,名字是 GetCommentsOptions,用这个 interface 描述一下这个函数要接收的参数,它里面有一个可选的 filter 属性,类型设置成 GetPostsOptionsFilter,这个 interface 我们是在 post.service 里定义的。
编辑器自动帮我们从 post.service 里导入了这个 interface。
回来继续编辑这个 getComments,给它添加一个 options 参数,类型设置成 GetCommentsOptions, 再改造一下函数的主体,可以解构一下函数支持的这个 options 选项,把它里面的 filter 先解构出来。
在这个 SQL 参数的下面,可以设置一下 SQL 参数,做一下判断,如果 filter 里面有 param 这个属性,我们就设置一下查询参数,把 filter 里的 param 放进来,后面再把 params 里的项目放进来。
下面还得再改造一下准备好的这段查询,在查询里面添加一个 WHERE ,把它放在 GROUP BY 的上面,过滤条件设置成 filter 里的 sql 属性。
打开 comment.controller,现在使用这个 getComments 的时候得给它提供一个选项参数,里面需要一个 filter 属性,对应的值可以设置成 request 里的 filter 这个属性的值。
再打开 comment.router,在文件的顶部,从 comment.middleware 里面,把 filter 这个中间件导入进来。来自当前目录下的 comment.middleware。
找到 评论列表 接口,在接口上安排一个 filter 中间件。
最后再到 HTTP 客户端测试一下,打开 评论列表 请求,发送一下这个请求,你会发现,这次得到的评论列表里面去掉了回复的评论。