如何修改代码实现认证用户仅能查询自身订单的功能
问题原因
- 路由层没有将token解析得到的用户唯一标识传给Controller层,仅传递了无用户信息的
req.body - Controller层
User.find的查询条件为空对象{},会匹配所有用户数据,自然返回全部内容
修改方案
1. 修改Router代码
将token解析得到的用户唯一标识(根据你token内存储的字段调整,示例假设为userId)传给Controller,移除不合理的req.body传参(GET请求不建议使用body传参,多数服务端会直接丢弃GET请求的body内容):
router.get("/my-orders", auth.verify, (req, res) => { const user = auth.decode(req.headers.authorization); if (!user.isAdmin) { // 传入当前用户的唯一标识 UserController.getMyOrders(user.userId).then(getMine => res.send(getMine)); } else { return res.status(403).send("Access denied."); } });
2. 修改Controller代码
给User.find添加查询过滤条件,仅匹配当前用户的数据:
module.exports.getMyOrders = (userId) => { // 第一个参数新增用户过滤条件,注:如果你的用户表唯一标识字段为_id,替换为{ _id: userId }即可 return User.find({ userId: userId }, { "isAdmin": 0, "_id": 0, "password": 0 }); }
可选优化
如果你的订单是单独存储在Order集合中,更合理的写法是直接查询订单集合,避免查询整个用户表:
module.exports.getMyOrders = (userId) => { // 直接查询订单集合,返回对应用户的所有订单 return Order.find({ userId: userId }); }
内容的提问来源于stack exchange,提问作者jclarete
相关产品推荐
相关产品推荐

