用户登录

在 PostService 里面,再定义一个可以删除多对多关系的方法,这个方法跟之前定义的 vote 差不多,直接复制一份这个 vote 方法,修改一下方法的名字,换成 unVote,接收 id 还有 user 参数。

方法里面使用创建的 QueryBuilder ,关系是 User 上的 voted,of user,然后把 add 换成 remove , 可以直接把实体的 id 交给这个方法,不过我发现会遇到点问题,等会儿再回来修改一下。

下面我们再去定义处理删除关系用的路由,可以单独去定义一下,或者直接使用在 PostController 里的 vote,先试一下,直接使用这个 vote 方法。

在这个方法的参数里添加一个查询参数,用 @Query 这个装饰器,需要的是 method 这个查询参数,参数的名字叫 method,它的值是一个 string。

然后在方法里面,做一下判断,如果 method 查询参数的值等于 delete ,我们可以 return await,this.postService.unVote ,把 id 还有 user 交给它。

测试

打开 HTTP 客户端,用一下 Post Vote 这个请求,在这个请求的地址里面可以添加一个查询参数,名字应该叫 method,它的值设置成 delete。这样发送这个请求就会使用 PostService 上的 unVote 方法 ,发送一下请求。

回到数据库客户端,我们期望的是删除掉了 id 号是 1 的用户投票给 id 号是 x 的内容的关系,不过这里并没有删除。

可以检查一下运行项目开发服务的终端,看一下记录的这条 SQL ,你会发现这条 SQL 的第二个参数值是 NULL ,它的值应该是内容的 id 号。

修正

回到 PostService ,找到 unVote,这里我们可以根据这个 postId 的值查询出对应的内容实体,然后把它交给 remove 方法,或者也可以这样,给它一个对象,然后里面添加一个 id 属性,值就是 unVote 方法的 id 参数的值。

再回到 HTTP 客户端,重新发送一下这个请求,再回到数据库客户端,检查一下,你会发送 id 号是 1 的用户投票给 id 号是 x 的内容这个关系已经被删除掉了。

再到终端检查一下,这回执行的这条 SQL 里面,第二个参数的值就是内容的 id 号。

独立方法

直接使用 vote 路由处理删除内容关系的请求,会有个问题,你会发现应用响应的状态码是 201,表示创建了新的内容,因为这个请求支持的是 HTTP 的 POST 方法。

删除资源一般我们会使用 DELETE 方法。

回到 PostController, 复制一下 vote 这个方法,然后再修改一下。去掉 vote 方法里的 method 参数,还有方法里的这个判断。下面这个 vote 方法的名字换成 unVote。

路由支持的 HTTP 方法设置成 DELETE,所以要使用 @Delete 装饰器,地址仍然是 :id/vote。去掉 method 参数。方法里面做的事情就是执行 postService 里的 unVote 方法。

测试

回到 HTTP 客户端,如果用 POST 方法请求这个地址,会保存用户与内容的关系。

现在可以把 Http 方法换成 Delete ,请求一下同样的地址,成功以后,响应的状态码是 200,再观察一下数据库,之前创建的用户与内容的关系现在就被删除掉了。

删除内容关系(多对多)《 Nest.js 应用框架:内容关系 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点