Postman用JWT更新用户报cannot read property id of undefined错误如何解决
问题根因及修复方案
你遇到的两个报错是关联出现的,核心问题在verifytoken.js文件的逻辑缺陷:
1. 致命逻辑错误:JWT校验失败后未终止代码执行
当前jwt.verify回调逻辑中,当校验出错返回token is not valid后,没有终止后续代码,仍然会执行req.user = user和next(),此时user为undefined,后续中间件访问req.user.id/req.user.isAdmin自然就会抛出"cannot read property xxx of undefined"报错。
2. Token拆分逻辑错误
你写的authHeader.split(" ")[1]用了多个空格作为分隔符:
- 如果你在Postman里的token header是直接填的token值没有加
Bearer前缀,拆分后索引1的值就是undefined,JWT校验必然失败 - 就算加了前缀,标准分隔符是1个空格,用多个空格也会拆分失败
修复步骤
第一步:修改verifytoken.js代码
替换后的完整代码如下:
const jwt = require("jsonwebtoken") const verifyToken = (req,res, next) => { const authHeader = req.headers.token if(authHeader) { // 修正分隔符为1个空格,同时兼容直接填token的写法 const token = authHeader.split(" ")[1] || authHeader; jwt.verify(token, process.env.JWT_SEC, (err, user)=>{ // 增加return终止后续代码执行 if(err) return res.status(403).json("token is not valid"); req.user = user; next(); }) } else { return res.status(401).json(" you are not authenticated"); } }; const verifyTokenAndAuthorization = (req,res,next) => { verifyToken(req,res,()=> { if(req.user.id === req.params.id || req.user.isAdmin ) { next(); } else { res.status(403).json("you are not allowed to do that"); } }); }; const verifyTokenAndAdmin = (req,res,next) => { verifyToken(req,res,()=> { if( req.user.isAdmin) { next(); } else { res.status(403).json("your are not the admin "); } }); }; module.exports = {verifyToken, verifyTokenAndAuthorization, verifyTokenAndAdmin};
第二步:检查Postman配置
- 确认请求Headers里的key是
token,和代码里req.headers.token的取值完全一致 - 确认value里填的token是登录接口返回的完整access token,没有多余空格或特殊字符
- 确认你要更新的用户id和token里的用户id一致,或者该token对应用户是管理员,否则会触发权限不足报错
内容的提问来源于stack exchange,提问作者Kerpen rodrigo rosa de miranda
相关产品推荐
相关产品推荐

