CORS not working

五迷三道 提交于 2020-02-02 13:56:45

问题


I have a contact form that the user fills out which gets posted to my Web API to be sent using nodemailer.

CORS works as expected with the when I run the client and API locally:

Client

localhost:4200 with POST request

sendEmail(queryObject: any) {
const body = JSON.stringify(queryObject);
const headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.post('http://localhost:3000/api/sendemail', body, {headers: headers})
  .map((response: Response) => response.json());
}

API

localhost:3000

but as soon as I deploy my API to heroku and change the POST URL in the client to point to Heroku I get the preflight error:

OPTIONS https://keilcarpenter-portfolioapi.herokuapp.com/api/sendemail 503 (Service Unavailable)

XMLHttpRequest cannot load https://keilcarpenter-portfolioapi.herokuapp.com/api/sendemail. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 503.

I am sure I have CORS set up properly in server.js on my API:

    app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

Why is CORS accepting the POST locally but not on Heroku?


回答1:


Ok, when you deploy a webapp or an app from differents port will make you deal with CORS, so you will need to configurate the server to be more friendly and accept CORS(makes you acept request form different origins). In tomcat modify web.xml, firebase do another thing, on azure the same etc... every serve has his own config. But in angular is the same, you must config a proxy to bypass these port problems. So create an proxy.conf.json like this

{
  "/angular": {
     "target":  {
       "host": "github.com",
       "protocol": "https:",
       "port": 443
     },
     "secure": false,
     "changeOrigin": true,
     "logLevel": "info"
  }
}

and then create a script like this in package.json:

"scripts": {
        "start": "ng serve --proxy-config proxy.conf.json",

and then instead run ng serve run ng start or npm start

Really nice documnets about this:

https://github.com/angular/angular-cli/pull/1896/commits/a81aa3b6117848a1c9c99d3b6d0666433b5144e0



来源:https://stackoverflow.com/questions/43038936/cors-not-working

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!