Express.js访问无效POST/PATCH REST端点触发CORS错误问题咨询
问题原因
- POST、PATCH请求携带
Content-Type: application/json请求头,不属于CORS简单请求范畴,浏览器会自动先发送OPTIONS类型的预检请求,要求服务端必须返回2xx状态码且携带正确CORS响应头,预检通过后才会发送实际业务请求。 - 你当前仅配置了CORS响应头,未单独处理OPTIONS请求:所有OPTIONS请求会和普通请求一样进入后续路由匹配流程,由于你的业务路由都只处理GET/POST/PATCH等业务方法,没有匹配的OPTIONS路由,最终会走到404中间件返回404状态码,不符合预检请求的要求,因此触发CORS错误。
- GET请求属于CORS简单请求,不需要发送预检请求,哪怕端点无效返回404,只要响应头携带正确CORS配置,前端就能正常拿到响应,不会触发CORS错误。
解决方案
修改全局CORS中间件,单独处理OPTIONS预检请求,匹配到OPTIONS方法后直接返回200状态即可,无需走后续路由逻辑,修改后的代码如下:
app.use((req, res, next) => { res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 新增OPTIONS请求处理逻辑 if (req.method === 'OPTIONS') { return res.sendStatus(200); } next(); });
修改后所有OPTIONS预检请求会直接返回200状态,预检通过后,无效POST/PATCH请求会正常走到404中间件,返回携带CORS头的404响应,前端可以正常拿到你定义的错误信息,不会再触发CORS错误。
内容的提问来源于stack exchange,提问作者Mitanshu
相关产品推荐
相关产品推荐

