Node.js服务器请求头未获取及JWT验证失败问题
Node.js请求头获取失败与JWT验证401错误的解决方案
报错根源
你遇到的TypeError: Cannot read properties of undefined (reading 'split')和401验证失败,本质是代码里三个致命问题:
- 请求头获取方式写错,导致
authorization值为undefined - Token提取逻辑错误,就算拿到请求头也取不对Token
- 没处理数据库查询返回
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
相关产品推荐
相关产品推荐

