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_tokencookie,避免中间件抛出认证错误导致后续逻辑未执行。
内容的提问来源于stack exchange,提问作者user18259724
相关产品推荐
相关产品推荐

