关于获取详情这类接口是不是需要写两个控制器,还有AdminGuard的一些疑问

来源:11-13 鉴权守卫:设置鉴权用户可访问的控制器(作业)

washeriarty

2023-06-20

请问老师:
源代码中,这个路由只针对当前登录的用户来获取自己的详情
@Get()
@UseGuard(AuthGuard(‘jwt’),AdminGuard)
getUsers(@Query query:getUserDto){
//调用userService获取个人详情
}

问题1:AdminGuard实际上已经调取了userService接口获得了用户详情,直接return 获取的个人详情,覆盖掉AuthGuard(‘jwt’)返回的req.user。然后在getUsers控制器中返回res.user即可,而且这样还会少一个请求。所以这个接口是不是不需要AdminGuard呢?

问题2:对于后台管理来说是不是还要写一个路由传递用户的id,然后根据id来获取用户的信息呢。因为此时的AuthGuard(‘jwt’)保存的是当前登录后台的管理员信息
@Get(":id")
@UseGuard(AuthGuard(‘jwt’),AdminGuard)
getUsersFromAdmin(@Param(‘id’) id:number ,@Query query:getUserDto){
//通过id调用userService获取个人详情
}
如果是这样的话那么所有的获取详情的相关路由是不是都要写两个呢,比如:“我的”订单列表,关注“我的”列表,“我”发布的朋友圈等等,这些接口如果是当前用户自己获取,那直接从AuthGuard(‘jwt’)中保存的id信息获取,对于后台管理人员来说那必须传递一个用户id,然后通过用户id来获取相关信息。
请问一下真实项目是这样设计两个api的吗,还是有什么办法合并这两个请求呢?谢谢。

写回答

1回答

Brian

2023-07-01

问题1:取决于你的具体需求,AdminGuard确实已经获取了用户的详细信息,并且这个信息就是你想在接口中返回的,那么可能你确实不需要再次调用userService,加入一个if条件判断就可以减少一次。


问题2:你的理解是正确的,真实的项目中是需要所有该用户的信息的,在这种情况下,提供一个接口,它接受一个用户ID并返回该用户的信息,是很常见。但是,是否每个分类,每个详情都需要,这个你自己来定啊?通常这个id会被保存在响应给用户的token中,redis中。


还是有什么办法合并这两个请求呢——你想合并的是详情与权限?通过id -> 判断权限 -> 查询用户对应的详情?不推荐,通常是两个接口,独立的接口会更加清晰,逻辑好管理。

0
0

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程