为什么设置了Access-Control-Allow-Origin却还是出现CORS错误?
我用Express写了后端API,设置了app.use(cors()),但前端调POST接口时还是报错“No ‘Access-Control-Allow-Origin’ header present”。明明已经引入了cors模块啊,哪里出问题了?
尝试过直接在响应头写res.header(“Access-Control-Allow-Origin”, “*”),但POST请求还是会卡在预检OPTIONS阶段。控制台只显示OPTIONS请求404,实际POST接口路径明明是正确的…
代码贴出来看看:
<pre class="pure-highlightjs line-numbers"><code class="language-javascript"><code class="language-javascript">const cors = require('cors');
app.use(cors({origin: 'http://localhost:3000'}));
// 接口路由在后面
app.post('/api/upload', (req, res) => {
res.send('ok');
});
</code></code></pre>
或者更明确点写成:
OPTIONS预检请求是浏览器自动发的,这时候你的路由还没走到cors中间件,所以返回的响应头里没有CORS相关字段,自然就卡住了。把cors中间件放在所有路由之前就对了。这坑我踩过无数次,记住中间件顺序真的很重要。
可以优化成这样:
关键是加了
app.options这一行,显式处理OPTIONS请求。不然Express找不到对应的路由时,会直接返回404,连CORS头都来不及设置。这种坑我以前也踩过,写API的时候确实要特别注意请求顺序和预检逻辑。