I have developed an angular 7 app with express backend. Express running on localhost:3000
and angular client is running on localhost:4200.
In the
I have been working with Angular cli and .net Framework in server side.
To solve this problem, I just ennable CORS interaction in server side using the following steps:
Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.2.6
And then, into WebApiConfig class:
Add using System.Web.Http.Cors;
Inside Register(HttpConfiguration config) method:
var cors = new EnableCorsAttribute("http://localhost:4200", "*", "*"); config.EnableCors(cors);
or
var cors = new EnableCorsAttribute("*", "*", "*"); //origin, headers, methods config.EnableCors(cors);
Since, your angular app is running on 4200 port and backend running on 3000 port, the origin of both the application is different.
To solve this problem, you can setup "nginx" in your machine.
This will make all your requests from angular and backend, go via "nginx" server. Thus, solving the problem of CORS.
If this is just for development I recommend using proxy that comes with angular-cli. Create a file called proxy.json
and
{
"/api/oauth2/login": {
"target": "http://localhost:3000/api/oauth2/login",
"secure": false
}
}
and the call ng serve --proxy-config proxy.json
. If you expect this to be still a problem in production then we have to have a bigger conversation.
Full documentation: https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md
Also what is CORS exacly: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
To divert all calls for http://localhost:4200/api
to a server running on http://localhost:3000/api
, take the following steps.
Create a file proxy.conf.json
in the projects src/
folder, next to package.json
.
Add the following content to the new proxy file:
{
"/api": {
"target": "`http://localhost:3000`",
"secure": false
}
}
...
"architect": {
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.json"
},
...
}
}
...
ng serve
.For Angular 7 you must do other implementation. From angular documentation you must create a proxy.js file:
https://angular.io/guide/build#using-corporate-proxy
Edit the path for your own backend server.
proxy.js:
var HttpsProxyAgent = require('https-proxy-agent');
var proxyConfig = [{
context: '/api',
target: 'http://your-remote-server.com:3000',
secure: false
}];
function setupForCorporateProxy(proxyConfig) {
var proxyServer = process.env.http_proxy || process.env.HTTP_PROXY;
if (proxyServer) {
var agent = new HttpsProxyAgent(proxyServer);
console.log('Using corporate proxy server: ' + proxyServer);
proxyConfig.forEach(function(entry) {
entry.agent = agent;
});
}
return proxyConfig;
}
module.exports = setupForCorporateProxy(proxyConfig);
Later add this to your package.json
"start": "ng serve --proxy-config proxy.js"
And call this with:
npm start
And in your app.js just simply add:
const cors = require("cors");
app.use(cors());
I had same problem and that solved my issue. I hope it helps!
I changed the callback mechanism to get past the CORS issue, I am utilizing a OAuth flow for the user to get authenticated from https://example.com which was redirecting to https://example.com/auth/callback, I was initiating the request from http://localhost:4200 and then sending the callback url to the server http://localhost:3000 and I was getting the CORS error.
Now, I am redirecting it to the client http://localhost:4200 and got past the CORS problem. All other calls for GET, POST, DELETE, PATCH is from the http://localhost:3000 which is working fine.
Thank you all for your inputs.