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

Node.js服务器请求头未获取及JWT验证失败问题

Node.js请求头获取失败与JWT验证401错误的解决方案

报错根源

你遇到的TypeError: Cannot read properties of undefined (reading 'split')和401验证失败,本质是代码里三个致命问题:

  1. 请求头获取方式写错,导致authorization值为undefined
  2. Token提取逻辑错误,就算拿到请求头也取不对Token
  3. 没处理数据库查询返回null的情况,后续读取邮箱直接报错

分步修复

1. 修正请求头读取逻辑

Node.js里获取请求头必须用req.headers(复数),不是req.header。而且标准Bearer Token格式是Bearer <token>,得用空格分割后取第2个元素:

const authHeader = req.headers.authorization;
// 先检查请求头是否存在且格式正确
if (!authHeader || !authHeader.startsWith('Bearer ')) {
  return res.status(401).send({ message: '请求头缺少有效Token' });
}
const token = authHeader.split(' ')[1]; // 提取真正的Token部分

2. 处理数据库查询为空的情况

User.findOne找不到对应Token时会返回null,必须先判断结果是否存在,再去读email:

const user_data = await User.findOne({ auth_token: token });
if (!user_data) {
  return res.status(401).send({ message: 'Token无效或未绑定用户' });
}
// 到这里再去分割邮箱
const jwtEmail = user_data.email.split('@')[0];

3. 完整修复后的验证中间件

const verifyToken = async (req, res, next) => {
  try {
    // 1. 校验请求头格式并提取Token
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).send({ message: '请求头缺少有效Token' });
    }
    const token = authHeader.split(' ')[1];

    // 2. 检查Token是否存在于数据库
    const user_data = await User.findOne({ auth_token: token });
    if (!user_data) {
      return res.status(401).send({ message: 'Token无效' });
    }

    // 3. 验证JWT签名
    const jwtEmail = user_data.email.split('@')[0];
    const decodedToken = jwt.verify(token, jwtEmail);
    
    // 可选:把解码后的用户信息挂载到req,方便后续接口使用
    req.user = decodedToken;
    next();
  } catch (error) {
    return res.status(401).send({
      message: "Auth failed",
      error: error.message
    });
  }
};

4. 生成Token的代码补全(避免坑)

生成Token时要确保email变量已正确获取,还要把生成的Token存到用户表的auth_token字段里:

const email = req.body.email;
// 先校验邮箱参数是否存在
if (!email) {
  return res.status(400).send({ message: '缺少邮箱参数' });
}
const jwtEmail = email.split('@')[0];
const token = jwt.sign({ user_data: email }, jwtEmail, { expiresIn: "24h" });

// 记得把Token更新到用户记录中
await User.findOneAndUpdate({ email }, { auth_token: token });

Postman调用注意事项

  • 打开请求头面板,添加Authorization字段,值填Bearer <你的Token>(注意Bearer和Token之间有空格)
  • 确认请求方法、接口路径和后端配置一致
  • 如果是跨域请求,后端要配置CORS允许携带Authorization请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:12:14