React对接Node.js接口出现CORS策略错误,配置cors包仍无效如何解决
问题根因
- CORS中间件仅绑定了根路径
/的GET路由,你实际访问的/api/table、/api/users/create等业务接口未应用任何CORS配置,响应头自然不会返回Access-Control-Allow-Origin字段 - 非简单请求(比如带JSON body的POST请求)会先发送OPTIONS类型的预检请求,你当前没有处理该类请求的CORS逻辑,导致预检直接被拦截
- 你用cURL测试的是根路径
/,和实际业务请求的路径不匹配,所以测试结果不能代表业务接口的配置状态
修复方案
将CORS中间件改为全局注册,且必须放在所有其他中间件、业务路由之前,修改后代码参考如下:
const express = require('express'); const app = express(); const cors = require('cors'); var corsOptions = { origin: 'https://idcapex-web-suprimentos-dev.apps.rosa-gerdau.bxnu.p1.openshiftapps.com', optionsSuccessStatus: 200, // 如果你用到自定义请求头或者特殊请求方法,可以补充以下配置 // allowedHeaders: ['Content-Type', 'Authorization'], // methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] } // 重点:全局注册CORS中间件,放在最前面 app.use(cors(corsOptions)) // 后续注册其他中间件 app.use(express.json({limit: '50mb'})); app.use(express.urlencoded({limit: '50mb'})); // 可删除重复的express.json()注册,前面已经配置过带limit参数的版本 // 业务路由不需要再加单独的cors参数,已经全局生效 app.get('/', function (req, res, next) { res.json({ msg: 'This is CORS-enabled for only https://idcapex-web-suprimentos-dev.apps.rosa-gerdau.bxnu.p1.openshiftapps.com.' }) }) // 你的其他业务路由(/api/table、/api/users/create等)正常写在后面即可
修复完成后可以用cURL测试实际业务接口的预检请求验证配置是否生效,示例命令:
curl -H "Access-Control-Request-Method: POST" -H "Origin: https://idcapex-web-suprimentos-dev.apps.rosa-gerdau.bxnu.p1.openshiftapps.com" -X OPTIONS --head https://idcapex-api-suprimentos-dev.apps.rosa-gerdau.bxnu.p1.openshiftapps.com/api/users/create
如果响应头中包含access-control-allow-origin字段即代表配置正常。
内容的提问来源于stack exchange,提问作者Neto
相关产品推荐
相关产品推荐

