You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js路由使用userId参数查询用户专属测验却返回所有用户数据的问题

问题诱因
  • 核心原因是Quiz.find()未添加任何过滤条件,直接查询了集合中所有测验数据,没有按用户维度筛选
  • 路由定义的:userId参数未被业务逻辑使用,同时userAuth中间件校验登录态后挂载的当前登录用户标识(通常为req.user.id)也没有被用于过滤查询
  • 前提要求你的Quiz数据模型中存在用于关联归属用户的字段(如userId/owner,类型为ObjectId关联用户表),否则无法做用户维度的筛选
修改方案
  1. 先确认Quiz模型的用户关联字段定义,示例参考:
// Quiz模型定义示例
const quizSchema = new mongoose.Schema({
  // 其他字段如标题、分类等省略
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true
  }
})
const Quiz = mongoose.model('Quiz', quizSchema)
  1. 修改路由的查询逻辑,给find方法传入过滤条件,优先使用userAuth挂载的可信用户ID(避免路由参数伪造导致越权),同时可以增加参数一致性校验防止越权,修改后代码如下:
const prefix = "/:userId/quizzes";

router.get(`${prefix}/my-quizzes`, userAuth, async (req, res) => {
  try {
    // 可选:校验路由传的userId和当前登录用户ID是否一致,防止越权
    if (req.params.userId !== req.user.id.toString()) {
      return res.status(403).json({
        message: "无权访问其他用户的测验数据",
        success: false
      })
    }
    // 增加userId过滤条件,仅查询当前登录用户的测验
    const quizes = await Quiz.find({ userId: req.user.id }).populate({
      path: "category",
      select: ["name"],
    });

    res.send(quizes);
  } catch (error) {
    return res.status(404).json({
      message: "Can't fetch quizes !",
      success: false,
    });
  }
});

如果你的userAuth中间件挂载的用户标识字段不是req.user.id,替换为实际的字段名即可。

内容的提问来源于stack exchange,提问作者theweirdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:08