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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:24:25