Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No 'Access-Control-Allow-Origin' - Node / Apache Port Issue

i've created a small API using Node/Express and trying to pull data using Angularjs but as my html page is running under apache on localhost:8888 and node API is listen on port 3000, i am getting the No 'Access-Control-Allow-Origin'. I tried using node-http-proxy and Vhosts Apache but not having much succes, please see full error and code below.

XMLHttpRequest cannot load localhost:3000. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost:8888' is therefore not allowed access."

// Api Using Node/Express     var express = require('express'); var app = express(); var contractors = [     {         "id": "1",          "name": "Joe Blogg",         "Weeks": 3,         "Photo": "1.png"     } ];  app.use(express.bodyParser());  app.get('/', function(req, res) {   res.json(contractors); }); app.listen(process.env.PORT || 3000); console.log('Server is running on Port 3000') 

Angular code

angular.module('contractorsApp', []) .controller('ContractorsCtrl', function($scope, $http,$routeParams) {     $http.get('localhost:3000').then(function(response) {        var data = response.data;        $scope.contractors = data;    }) 

HTML

<body ng-app="contractorsApp">     <div ng-controller="ContractorsCtrl">          <ul>             <li ng-repeat="person in contractors">{{person.name}}</li>         </ul>     </div> </body> 
like image 785
user1336103 Avatar asked Aug 19 '13 09:08

user1336103


People also ask

How do I fix no Access-Control allow origin?

This error occurs when the client URL and server URL don't match, including the port number. In this case you need to enable your service for CORS which is cross origin resource sharing. If you are hosting a Spring REST service then you can find it in the blog post CORS support in Spring Framework. Stop the Node.

How do I resolve cross origin issues in node JS?

To solve this error, we need to add the CORS header to the server and give https://www.section.io access to the server response. Include the following in your index. js file. const cors = require('cors'); app.

How do I enable Access-Control allow origin in Express?

Enabling CORS The easiest way to get CORS working in Express is by using the cors npm module. That's it. CORS is now enabled. The Access-Control-Allow-Origin header determines which origins are allowed to access server resources over CORS (the * wildcard allows access from any origin).


2 Answers

Try adding the following middleware to your NodeJS/Express app (I have added some comments for your convenience):

// Add headers before the routes are defined app.use(function (req, res, next) {      // Website you wish to allow to connect     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');      // Request methods you wish to allow     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');      // Request headers you wish to allow     res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');      // Set to true if you need the website to include cookies in the requests sent     // to the API (e.g. in case you use sessions)     res.setHeader('Access-Control-Allow-Credentials', true);      // Pass to next layer of middleware     next(); }); 

Hope that helps!

like image 104
jvandemo Avatar answered Sep 25 '22 14:09

jvandemo


Accepted answer is fine, in case you prefer something shorter, you may use a plugin called cors available for Express.js

It's simple to use, for this particular case:

var cors = require('cors');  // use it before all route definitions app.use(cors({origin: 'http://localhost:8888'})); 
like image 44
Fabiano Soriani Avatar answered Sep 22 '22 14:09

Fabiano Soriani