Express.js无法从请求头获取Token问题排查求助
认证问题排查与修复方案
前端请求错误(核心原因)
你的axios.post调用写法错误:axios.post的第二个参数是请求体数据,请求头配置必须放在第三个参数的配置对象中。当前你把headers写在了第二个参数里,导致后端完全接收不到这个认证请求头。
修复后的前端代码:
const token = localStorage.getItem("token"); // 注意:若后端要求Token带`Bearer `前缀,需改为`Authorization: Bearer ${token}` const { data } = await axios.post( "/messages", {}, // 此处放请求体数据,无数据则传空对象 { headers: { Authorization: token }, } );
后端代码的潜在问题及修复
1. 请求头获取的兼容性优化
部分服务器环境对请求头大小写敏感,建议直接从req.headers对象获取,同时兼容标准JWT的Bearer <token>格式:
// 替换原有的req.get("authorization") const authHeader = req.headers.authorization; let token = null; // 处理带Bearer前缀的Token格式 if (authHeader && authHeader.startsWith('Bearer ')) { token = authHeader.slice(7); // 移除"Bearer "前缀 }
2. 中间件逻辑错误修复
你的中间件在try块中直接执行res.status(200).send("Access granted."),会直接终止请求流程,导致后续的req.isAuth = true; return next();永远无法执行,违背了中间件"预处理后转交后续逻辑"的设计原则。
修复后的后端中间件代码:
const jwt = require("jsonwebtoken"); module.exports = (req, res, next) => { const authHeader = req.headers.authorization; let token = null; if (authHeader && authHeader.startsWith('Bearer ')) { token = authHeader.slice(7); } console.log(token); if (!token || token === "") { req.isAuth = false; return next(); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.duser = decoded.user; req.isAuth = true; next(); // 转交后续路由/中间件处理,不要直接返回响应 } catch (error) { req.isAuth = false; // 可选:若需直接返回无效Token错误,取消下面注释 // return res.status(403).send("Token is not valid."); next(); } };
3. 冗余代码清理
后端代码顶部的const token = localStorage.getItem("token");是浏览器环境API,Node.js无法运行,直接删除即可。
内容的提问来源于stack exchange,提问作者PTsag
相关产品推荐
相关产品推荐

