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

提交新问题失败: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属性,可能的触发点:

  1. 验证中间件validationtoken.js未在提交问题的路由中优先执行,controller执行时还未给req.user赋值
  2. JWT生成时的payload里没有user对象,或者user对象中不包含id字段,导致decoded.user不存在
  3. 请求未携带有效的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:47:15