在ExpressJS中接受自定义HttpHeaders以获取CORS请求

时间:2013-07-04 10:02:16

标签: node.js express http-headers cors

我有一个ExpressJS应用程序通过REST公开一些数据。当我从相同的源或使用curl访问REST接口时,一切都很好,我的自定义http标头被提供给我的路由。

但是当我尝试从另一个来源访问REST接口时,我的标题会被删除。

expressjs配置如下所示

app.use(express.bodyParser());

var allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET');
  res.header('Access-Control-Allow-Headers', 'Accept');

  if ('OPTIONS' == req.method) {
    res.send(200);
  }
  else {
    next();
  }
};
app.all('/',allowCrossDomain);
app.get('/foo', function(req,res){
  console.dir(req.headers);
});

我尝试使用以下JS代码访问api

var properties = {
    url: 'http://localhost:3001/foo?callback=?,
    type: 'GET',
    dataType: 'jsonp',
    headers: { "x-foo" : "FooBar"}
};
$.ajax(properties).done(onSuccess).fail(function(r, s, e) {
  console.log(e);
});

在服务器端,自定义标头x-foo不是req.headers的一部分。如果我使用以下curl命令,我的标题存在

curl -H "x-foo: FooBar" -G http://localhost:3001/foo

不幸的是,我无法找到任何解决方案来启动和运行。

1 个答案:

答案 0 :(得分:2)

你的行

app.all('/', ...);

不会做你认为它做的事情。它 NOT 处理所有传入的请求。它只处理/的所有传入请求,无论使用的是什么动词。因此,all表示所有动词,而不是所有路径。有关详细信息,请参阅其documentation

因此,当您尝试使用/foo调用访问$.ajax时,不会触发您的CORS中间件。也许这可能是原因。至少这可以解释为什么它可以在localhost和curl中运行,但不能在使用不同域的浏览器中运行。

希望这有帮助。

PS:我建议不要编写自己的CORS中间件,而是使用现有的中间件。我用node-cors做了很好的经历。