在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做了很好的体验。