前端无法直接绕过浏览器 cors 限制,必须通过自建代理服务(如 node.js 后端)转发请求并添加响应头,从而安全、合规地桥接前端与不支持跨域的第三方 api。
当在 React 应用中直接调用第三方 API 时,若目标服务未配置 Access-Control-Allow-Origin 等必要响应头,浏览器将拦截预检请求(OPTIONS)或实际请求,抛出 “CORS pre-flight blocked” 错误。关键前提需明确:mode: 'cors' 是客户端声明行为,不能强制绕过限制;CORS 策略由浏览器强制执行,且响应头(如 Access-Control-Allow-Origin)只能由服务端设置——因此,前端 fetch 中将 mode: 'cors' 写入 headers 是无效的(它属于 RequestInit 配置项,非 HTTP 头),该写法甚至会导致请求失败。
✅ 正确解法:构建轻量后端代理层
推荐使用 Express + Axios 搭建反向代理服务,统一处理跨域逻辑:
// sample.js(路由模块)
const express = require('express');
const router = express.Router();
const axios = require('axios');
const cors = require('cors');
// 启用 CORS 中间件(自动注入响应头)
router.use(cors({
origin: 'http://localhost:3000', // 建议明确指定前端域名,生产环境禁用 '*'
credentials: true // 如需携带 cookie,请同步配置
}));
router.post('/', async (req, res) => {
try {
const { name } = req.body;
const thirdPartyUrl = 'https://sample.com/api/data';
// 使用 axios 转发请求(无浏览器 CORS 限制)
const response = await axios.post(thirdPartyUrl, { name }, {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 注意:此处无需设 CORS 相关头,axios 请求不受浏览器策略约束
},
timeout: 10000
});
// 直接透传响应体与状态码(可选:过滤敏感字段)
res.status(response.status).json(response.data);
} catch (error) {
console.error('Third-party API error:', error.response?.status, error.message);
res.status(error.response?.status || 500)
.json({ error: 'Failed to fetch from external service' });
}
});
module.exports = router;// app.js(主应用)
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const PORT = 8080;
// 解析 JSON 请求体
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// 挂载代理路由
app.use('/api/proxy', require('./sample'));
app.listen(PORT, () => {
console.log(`✅ Proxy server running on http://localhost:${PORT}`);
});? 关键注意事项:

通过该代理模式,前端只需调用 http://localhost:8080/api/proxy,完全规避浏览器 CORS 校验,同时保持架构清晰、安全可控。