Node.js Express全局中间件无法获取Authorization请求头问题
核心问题出在两点:CORS配置缺失 + OPTIONS请求处理逻辑错误
1. CORS未授权Authorization头
跨域场景下,浏览器发送带Authorization头的请求前,会先发送OPTIONS预检请求,询问服务器是否允许这个自定义头。如果服务器的CORS响应里没有Access-Control-Allow-Headers: Authorization,浏览器会直接拦截后续实际请求的Authorization头,导致后端拿不到req.headers.authorization——这就是你看到access-control-request-headers里有authorization,但实际请求头不存在的原因。之前单端点配置时可能附带了CORS处理,全局迁移后没跟上。
2. OPTIONS请求的逻辑篡改了请求方法
你的unless函数把OPTIONS请求的reqMethod替换成了access-control-request-method,但如果publicPaths里没匹配到这个转换后的方法,OPTIONS请求会触发鉴权中间件。但OPTIONS请求本身不会携带Authorization头,会直接触发鉴权失败,进而让浏览器终止后续实际请求。
解决步骤
第一步:补全CORS配置,允许Authorization头
优先使用官方cors中间件,或者手动配置,注意要把CORS放在所有路由、鉴权中间件之前:
// 用cors中间件的方式(推荐) const cors = require('cors'); app.use(cors({ origin: '你的前端域名', // 生产环境别用true,指定具体域名 allowedHeaders: ['Authorization', 'Content-Type'], methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] })); // 手动配置的方式 app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '你的前端域名'); res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // OPTIONS预检请求直接返回200,不用走后续逻辑 if (req.method === 'OPTIONS') { return res.sendStatus(200); } next(); });
第二步:修复unless函数的OPTIONS处理逻辑
别篡改OPTIONS的请求方法,直接放行所有OPTIONS请求——因为它只是预检,不需要鉴权:
const unless = function(path, middleware) { return function(req, res, next) { // 所有OPTIONS请求直接放行,不参与鉴权判断 if (req.method === 'OPTIONS') { return next(); } const reqMethod = req.method; // 匹配公开路由规则 const isPublic = path.find(({url, method, methods}) => { return url === req.path && (method === reqMethod || methods === reqMethod); }); isPublic ? next() : middleware(req, res, next); }; };
第三步:检查publicPaths的格式一致性
确保数组里的对象key统一,别混用method和methods,比如:
const publicPaths = [ { url: '/api/login', method: 'POST' }, { url: '/api/register', method: 'GET' } ];
验证
重启服务后,用浏览器开发者工具查看Network面板,确认实际请求的Request Headers里存在Authorization,后端req.headers.authorization就能正常拿到值了。
内容的提问来源于stack exchange,提问作者pop

