You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Node.js Express服务器跨域请求被拦截,配置响应头仍报错

问题分析与解决方案

让我帮你排查这个跨域问题,其实问题出在两个关键地方:服务器端的语法错误,以及客户端做了不必要的请求头设置。

首先看最致命的问题——服务器端的语法错误:你写的 res.header('Access-Control-Allow-Origin'. '*'); 里,把参数分隔的逗号写成了点号(.),这会导致这条核心的CORS响应头根本没有被正确设置,浏览器自然会提示“CORS header ‘Access-Control-Allow-Origin’ missing”。

其次,客户端代码多做了无用功Access-Control-Allow-OriginAccess-Control-Allow-Methods 这些都是服务器返回给浏览器的响应头,客户端发起请求时完全不需要设置这些头,反而会干扰正常的CORS校验流程。


修正后的服务器代码

app.get('/api', function(req, res){ 
  // 把点号改成逗号!这是核心修复点
  res.header('Access-Control-Allow-Origin', '*'); 
  res.header('Access-Control-Allow-Methods', 'GET'); 
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 
  res.status(200).send({'a':'b'}); 
});

修正后的客户端代码

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){ 
  if(this.readyState === 4 && this.status === 200){ 
    console.log(this.response); 
  } 
}; 
xhr.open('GET', 'http://www.example.com/api', true); 
// 删掉这三行不必要的请求头设置,它们不属于客户端该发的内容
// xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); 
// xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET'); 
// xhr.setRequestHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 
xhr.send(null);

额外优化建议

如果你的Express项目里有多个需要跨域的接口,推荐使用官方维护的 cors 中间件,这样更简洁也不容易出错:

  1. 先安装依赖:npm install cors
  2. 在项目中配置使用:
const cors = require('cors');
// 全局配置跨域规则
app.use(cors({
  origin: '*',
  methods: ['GET'],
  allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept']
}));

// 之后你的/api接口就不用重复设置响应头了
app.get('/api', function(req, res){ 
  res.status(200).send({'a':'b'}); 
});

这样修改后,Firefox就能正常处理跨域请求了。

内容的提问来源于stack exchange,提问作者Ben Hagel

火山引擎 最新活动