为何Express Router全局用authUser触发CORS预请求失败,路由单独用则正常?
问题根源:跨域预检请求被拦截
你遇到的核心问题是全局挂载中间件时,浏览器的OPTIONS预检请求也会经过authUser验证,而预检请求不会携带Cookie,直接返回403导致预检失败,触发CORS错误。
两种挂载方式的请求流程差异
- 单个路由挂载:只有匹配到
GET /content的请求才会触发authUser。浏览器发送的OPTIONS预检请求找不到对应的路由规则,会自动走到CORS处理逻辑(假设你配置了CORS中间件),返回200后再发送带Cookie的实际GET请求,验证通过。 - 全局挂载:所有请求(包括OPTIONS)都会先经过authUser。预检请求不带Cookie,authUser检测不到token直接返回403,浏览器认为预检失败,就不会发送后续的实际请求。
解决方案
1. 修改authUser跳过OPTIONS请求
在中间件开头判断请求方法,如果是OPTIONS直接放行:
export function authUser(req, res, next) { // 放行OPTIONS预检请求 if (req.method === 'OPTIONS') { return next(); } let token = req.cookies?.token; if (token) { jwt.verify(token, process.env.jwt_secret, (err, data) => { if (err) { res.sendStatus(403); } else { req.username = data; next(); } }); } else { res.sendStatus(403); } }
2. 确保CORS配置正确支持带Cookie
如果使用cors包,需明确配置允许的前端域名和开启凭证支持(不能用*作为origin):
const cors = require('cors'); app.use(cors({ origin: 'http://你的前端域名:端口', // 比如http://localhost:8080 credentials: true }));
同时前端请求时要开启withCredentials(比如axios配置:axios.defaults.withCredentials = true),和你后端Cookie的sameSite: 'none'、secure: true配置配合才能正常携带Cookie。
内容的提问来源于stack exchange,提问作者nepeb
相关产品推荐
相关产品推荐

