在ExpressJS中接受CORS请求的自定义HttpHeaders

我有一个ExpressJS应用程序通过REST暴露一些数据。 当我从同一个来源访问REST接口或使用curl时,一切正常,并且我的自定义http头被发送到我的路由。

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

expressjsconfiguration看起来像这样

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 

不幸的是,我无法find任何解决scheme来启动和运行。

你的线

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

不会做你可能认为的事情。 它不处理所有传入的请求。 它只处理/所有传入请求,而不pipe正在使用的动词。 因此, all意味着所有的动词 ,而不是所有的路线 。 详细信息请参阅其文档 。

所以,当您尝试使用$.ajax调用来访问/foo ,您的CORS中间件不会被触发。 也许这可能是原因。 至less这可以解释为什么它从localhost和curl ,而不是在浏览器内使用不同的域。

希望这可以帮助。

PS:我build议不要编写自己的CORS中间件,而是使用现有的中间件。 我用Node-Cors做了很好的体验。