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

Review验证失败:userId路径必填问题排查(附相关代码)

问题分析与解决:Review创建时userId验证失败

问题现象

调用创建Review的API时,收到错误:Review validation failed: userId: Path userId is required。请求体未传入userId,控制器代码尝试从req.userId获取该值,但验证仍失败。

核心原因

  • 变量名不匹配:verifyToken中间件解析JWT后,将用户信息赋值给了req.user,但控制器代码里却试图读取req.userId,导致req.userId实际为undefined,无法通过Mongoose的必填字段验证。
  • Mongoose验证触发:Schema中userId被标记为required: true,保存newReview实例时,Mongoose检测到该字段值缺失,抛出验证错误。

解决办法

方法一:修正控制器中的变量引用

将控制器里的req.userId改为req.user.id(需确保JWT payload中包含用户ID字段id):

export const createReview = async (req, res, next) => {
  const newReview = new Review({
    userId: req.user.id, // 修正为req.user.id
    noteId: req.body.noteId,
    desc: req.body.desc,
    star: req.body.star,
  });

  try {
    const review = await Review.findOne({
      noteId: req.body.noteId,
      userId: req.user.id, // 同步修改此处
    });

    if (review)
      return next(
        createError(403, "You have already created a review for this note!")
      );

    const savedReview = await newReview.save();

    await Note.findByIdAndUpdate(req.body.noteId, {
      $inc: { totalStars: req.body.star, starNumber: 1 },
    });
    res.status(201).send(savedReview);
  } catch (err) {
    next(err);
  }
};

方法二:修改中间件的赋值变量名

如果希望保持控制器中使用req.userId,可调整verifyToken中间件,直接将用户ID赋值给req.userId:

export const verifyToken = (req, res, next) => {
  const token = req.cookies.access_token;
  if (!token) return next(createError(401, "You are not authenticated!"));

  jwt.verify(token, process.env.SECRET_KEY, (err, user) => {
    if (err) return next(createError(403, "Token is not valid!"));
    req.userId = user.id; // 改为req.userId
    next()
  });
};

额外检查项

  • 确认JWT的payload中确实包含用户ID字段(如id或_id),若字段名不同,需同步调整代码中的引用。
  • 测试时确保请求携带有效的access_token cookie,避免中间件抛出认证错误导致后续逻辑未执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:15:00