TypeError: 无法读取undefined的access_token属性问题排查请求
问题排查与解决方案
错误原因
报错TypeError: 无法读取undefined的属性(读取“access_token”)出现在verifyToken函数的const token = req.cookies.access_token;行,核心原因是Express请求对象req上不存在cookies属性,导致读取access_token时触发undefined错误。
具体诱因
- 未挂载cookie-parser中间件:虽然登录控制器中导入了
cookie-parser,但未在Express主应用中挂载该中间件,导致Express无法解析请求中的Cookie,req.cookies自然为undefined。 - 代码中还存在其他潜在错误(虽不直接触发当前报错,但会导致功能异常):
- 更新用户控制器中错误使用
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
相关产品推荐
相关产品推荐

