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

TypeError: 无法读取undefined的access_token属性问题排查请求

问题排查与解决方案

错误原因

报错TypeError: 无法读取undefined的属性(读取“access_token”)出现在verifyToken函数的const token = req.cookies.access_token;行,核心原因是Express请求对象req上不存在cookies属性,导致读取access_token时触发undefined错误。

具体诱因

  1. 未挂载cookie-parser中间件:虽然登录控制器中导入了cookie-parser,但未在Express主应用中挂载该中间件,导致Express无法解析请求中的Cookie,req.cookies自然为undefined。
  2. 代码中还存在其他潜在错误(虽不直接触发当前报错,但会导致功能异常):
    • 更新用户控制器中错误使用req.status,应为res.status
    • 注册控制器中错误从User模型解构password和email,应从req.body获取
    • 登录路由的验证数组存在语法错误(括号不匹配)

解决方案

1. 挂载cookie-parser中间件

在Express主入口文件(如app.js)中添加以下代码,且需放在所有路由挂载之前:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 解析Cookie的中间件,必须放在路由之前
app.use(cookieParser());

// 后续挂载你的路由
app.use('/api/auth', require('./routes/auth'));
app.use('/api/users', require('./routes/users'));

2. 修正更新用户控制器的错误

将updateUser函数中的req.status改为res.status:

const updateUser = async (req, res, next) => {
    try {
        let find = await User.findById(req.params.id)
        if (!find) {
            // 修正:req -> res
            return res.status(400).send("User not found")
        }

        let updateUser = await User.findByIdAndUpdate(req.params.id,
            { $set: req.body },
            { new: true })
        res.status(200).json(updateUser)
    } catch (error) {
        res.status(500).json({ status: "server error", message: error.message })
    }
}

3. 修正注册控制器的解构错误

将注册函数中从User模型解构改为从req.body获取参数:

const register = async (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  // 修正:从req.body解构,而非User模型
  const { password, email } = req.body;
  try {
    let user = await User.findOne({ email: email })
    // ... 其余代码不变
  } catch (error) {
    res.status(500).json({ status: "server error", message: error.message })
  }
}

4. 修正登录路由的语法错误

修复登录路由中验证数组的括号不匹配问题:

// 登录路由
router.post("/login", [
    body('email',"Email is not valid").isEmail(),
    body('password',"password must contain at least 5 characters").isLength({ min: 5 }),
], login)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:51:24