提交新问题失败:TypeError: 无法读取undefined的'id'属性解决方案咨询
问题:提交新问题时抛出TypeError: Cannot read properties of undefined (reading 'id')
错误场景
提交新问题接口报错,错误信息为:TypeError: Cannot read properties of undefined (reading 'id'),相关代码片段如下:
controller.js
question = new Question({ user_id: req.user.id, type, head, body, file, answer, });
Model.js
user_id: { type: mongoose.Schema.Types.ObjectId, required: true, ref: "User", },
validationtoken.js
if (authHeader && authHeader.startsWith("Bearer")) { token = authHeader.split(" ")[1]; jwt.verify(token, process.env.TOKEN_KEY, (err, decoded) => { if (err) { res.status(401); throw new Error("User is not authorized"); } req.user = decoded.user; next(); }); }
问题原因
报错核心是req.user为undefined,导致无法读取id属性,可能的触发点:
- 验证中间件
validationtoken.js未在提交问题的路由中优先执行,controller执行时还未给req.user赋值 - JWT生成时的payload里没有
user对象,或者user对象中不包含id字段,导致decoded.user不存在 - 请求未携带有效的
Authorization: Bearer <token>头,中间件未进入赋值逻辑,req.user始终为undefined
解决方案
- 确保中间件执行顺序正确:定义提交问题的路由时,先挂载
validationtoken中间件,再绑定controller,示例:router.post('/question', validationtoken, submitQuestionController); - 检查JWT生成逻辑:生成token时必须把包含
id的user对象放入payload,示例:const token = jwt.sign( { user: { id: user._id } }, // 确保此处包含user.id process.env.TOKEN_KEY, { expiresIn: "2h" } ); - 校验请求头合法性:确认前端请求时,
Authorization头格式为Bearer <token>,且token未过期、未被篡改 - 添加兜底判断:在controller中先校验
req.user是否存在,避免直接读取属性报错:if (!req.user?.id) { return res.status(401).json({ error: "用户未授权,请重新登录" }); } question = new Question({ user_id: req.user.id, type, head, body, file, answer, });
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

