与另一台服务器上的expressjs交互,导致Access-Control-Allow-Headers错误

时间:2016-07-10 13:45:51

标签: node.js amazon-web-services express chat

我正在尝试在我的亚马逊服务器上实施Spika网络聊天([http://spikaapp.com/][1])。我在一个服务器实例上有我的网站代码,在另一个服务器实例上有Spika聊天服务器。 Spika聊天服务器已启动并正在运行。现在,当我尝试与我的网站上的服务器进行交互时,我收到此错误:

XMLHttpRequest cannot load http://example.com:8000/spika/v1/user/list/Boom?_=1468157726669.
Request header field access-token is not allowed by Access-Control-Allow-Headers
in preflight response.

早些时候我遇到了CORS错误我解决了这个错误:http://enable-cors.org/server_expressjs.html

现在我可以登录但是我的客户但登录后不久我就收到了上述错误。我目前用于启用CORS的expressjs API处理程序代码:

    app.use(function(req, res, next) {
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
        res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
        next();
    });

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

服务器(发送POST请求)需要在其响应中包含Access-Control-Allow-Headers标题(等) 。将它们放入客户的请求中无效。

这是因为由服务器指定它接受跨源请求(并且它允许Content-Type请求标头等等) - 客户端无法自行决定给定服务器应该允许CORS。

当您开始使用自定义请求标头时,您将获得CORS预检。这是一个使用HTTP OPTIONS动词的请求,其中包含多个标题,其中一个标题为Access-Control-Request-Headers,列出了客户希望包含在请求中的标题。

您需要使用相应的CORS标头回复该CORS预检,才能使其正常工作。其中一个确实是Access-Control-Allow-Headers。该标头需要包含Access-Control-Request-Headers标头包含的相同值(或更多)。

https://fetch.spec.whatwg.org/#http-cors-protocol更详细地解释了此设置。

答案 1 :(得分:0)

我使用https://www.npmjs.com/package/cors解决了这个问题。谢谢你所有的帮助:)