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

使用PassportJS做认证时获取Token报错:无法读取headers属性

解决Express-JWT获取Token时的TypeError问题

问题场景

用PassportJS实现认证功能,客户端尝试获取Token时触发错误,相关代码:

import jwt from "express-jwt"
const getTokenFromHeaders  = (req) => {
    const {headers : {authorization}} = req

    if(authorization &&  authorization.spilt(' ')[0] === 'Token' ){
        return authorization.split(' ')[1]
    }
    return null
}

控制台报错信息

file:///C:/Users/atala/Desktop/atalayapp-main/backend/middleware/auth/auth.js:3
    const {headers : {authorization}} = req
                                        ^

TypeError: Cannot read properties of undefined (reading 'headers')
    at getTokenFromHeaders (file:///C:/Users/Desktop/atalayapp-main/backend/middleware/auth/auth.js:3:41)
    at file:///C:/Users/Desktop/atalayapp-main/backend/middleware/auth/auth.js:15:20
    at ModuleJob.run (node:internal/modules/esm/module_job:198:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:385:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/run_main:61:12)

错误原因

  1. getTokenFromHeaders被调用时未传入有效的req对象,导致req本身为undefined,解构req.headers时触发TypeError。
  2. 代码存在拼写错误:authorization.spilt(' ')里的spilt应为split,这会导致后续Token提取失败。

修复方案

  1. 确保函数调用场景正确:getTokenFromHeaders必须在Express中间件流程内调用,保证传入的是完整的Express请求对象。比如和express-jwt配合时,要正确配置getToken选项。
  2. 增加防御性判断:先检查req和req.headers是否存在,避免解构时出错。
  3. 修正拼写错误:把spilt改成split。

修复后的完整代码示例:

import jwt from "express-jwt";

const getTokenFromHeaders = (req) => {
    // 先做防御性检查,避免req或headers不存在的情况
    if (!req || !req.headers) return null;
    const { authorization } = req.headers;

    if (authorization && authorization.split(' ')[0] === 'Token') {
        return authorization.split(' ')[1];
    }
    return null;
};

// 正确配置express-jwt中间件
const authMiddleware = jwt({
    secret: '你的认证密钥', // 替换为实际使用的密钥
    algorithms: ['HS256'], // 根据你的加密算法调整
    getToken: getTokenFromHeaders
});

// 在需要认证的路由中使用该中间件
app.use('/api/protected', authMiddleware, (req, res) => {
    res.json({ message: '已通过认证', user: req.user });
});

内容的提问来源于stack exchange,提问作者Atalay Özyıldırım

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:48:19