Node.js路由使用userId参数查询用户专属测验却返回所有用户数据的问题
问题诱因
- 核心原因是
Quiz.find()未添加任何过滤条件,直接查询了集合中所有测验数据,没有按用户维度筛选 - 路由定义的
:userId参数未被业务逻辑使用,同时userAuth中间件校验登录态后挂载的当前登录用户标识(通常为req.user.id)也没有被用于过滤查询 - 前提要求你的Quiz数据模型中存在用于关联归属用户的字段(如
userId/owner,类型为ObjectId关联用户表),否则无法做用户维度的筛选
修改方案
- 先确认Quiz模型的用户关联字段定义,示例参考:
// Quiz模型定义示例 const quizSchema = new mongoose.Schema({ // 其他字段如标题、分类等省略 userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true } }) const Quiz = mongoose.model('Quiz', quizSchema)
- 修改路由的查询逻辑,给
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
相关产品推荐
相关产品推荐

