用户登录

在内容这边儿,我们可以查询出给内容投过票的用户都是谁,先在内容实体上面定义一个多对多的关系,打开 Post 实体,用 @ManyToMany 这个装饰器来定义多对多的关系,关系关联的实体类型是 User,在 User 那边,这个关系是 User 上的 voted 。

这个关系我们可以叫它 liked ,它应该是一组 User 实体。

然后打开 PostController,添加一个新的路由,用 @Get 装饰器,地址是 :id/liked。

使用一个拦截器,要用的是 ClassSerializerInterceptor,方法的名字可以叫 liked,方法有个 id 参数,用 @Param 装饰一下,需要的是 id 地址参数,这个参数值用 ParseIntPipe 转换成数字 ,参数的名字叫 id,类型是 number。

方法 return 的是 await,用一下 this.postService 上的 liked ,把 id 交给这个方法。

再打开 PostService,在内容服务里添加内容控制器需要的 liked 这个方法,方法的名字叫 liked,接收一个 id 参数,类型是 number。

方法里面可以只返回一组用户,就是给指定 id 的内容投过票的用户,return 的是 await,用一下 this.postRepository,用一下它上面的 createQueryBuilder,创建一个查询构建器,relation,关系是 Post,上面的 liked ,of,把内容的 id 或者内容实体 交给它。再用一下 loadMany。

打开 HTTP 客户端,添加一个请求,名字可以叫 Post Liked,方法是 GET,请求的地址是 localhost:3000,posts,后面加上内容的 id ,然后是 liked。

错误

提示了一个 404 的错误,应该是在定义这个路由的时候出了问题,去掉 id 前面的斜线,再回来重新发送一下这个请求。

这回又提示了一个 500 的错误,提示 cannot read property tableName of undefined。

我们应该在 User 实体的这个 ManyToMany 关系上面,描述一下另外一边儿的关系,打开 User 实体,找到 voted 这个关系,设置一下,在另外一边,这个关系应该是 post 上面的 liked。

测试

再回到 HTTP 客户端,重新发送一下这个请求。

这回响应回来的东西就是给 id 号是 1 的这个内容投过票的用户列表,现在这个列表里只有一个项目。

下面可以再让一个用户给它投个票,先发送一个登录请求,用户名是 xiaoxue,再输入用户的密码,发送一下这个请求,复制一下响应里的 token 的值。

再去投个票,把给 xiaoxue 签发的 JWT 粘贴到这个 token 里面,内容的 id 号是 1,发送一下这个请求。

再去看一下给 id 号是 1 的内容投过票的用户列表,现在这个列表里面就会出现小雪这个用户。

定义与查询反向多对多关系《 Nest.js 应用框架:内容关系 》

统计

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

社会化网络

关于

微信订阅号

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