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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:17:09