Pas De Problème De Port' Access-Control-Allow-Origin ' - Node / Apache

j'ai créé une petite API en utilisant Node/Express et en essayant de récupérer des données en utilisant Angularjs, mais comme ma page html tourne sous apache sur localhost:8888 et que l'API node est listen sur le port 3000, j'obtiens le No 'Access-Control-Allow-Origin'. J'ai essayé d'utiliser node-http-proxy et Vhosts Apache mais n'ayant pas beaucoup de succès, s'il vous plaît voir l'erreur complète et le code ci-dessous.

"XMLHttpRequest ne peut pas charger localhost:3000. Aucun en-tête 'Access-Control-Allow-Origin' n'est présent ressource demandée. L'origine "localhost: 8888" n'est donc pas autorisée."

// 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').success(function(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>
187
demandé sur user1336103 2013-08-19 13:22:50

10 réponses

essayez d'ajouter l'intergiciel suivant à votre application NodeJS/Express (j'ai ajouté des commentaires pour votre commodité):

// Add headers
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();
});

Espère que ça aide!

488
répondu jvandemo 2013-08-19 10:23:25

Accepté la réponse est bien, dans le cas où vous préférez quelque chose de plus court, vous pouvez utiliser un plugin appelé cors disponible pour les Exprimer.js

C'est simple à utiliser, pour ce cas particulier:

var cors = require('cors');

// use it before all route definitions
app.use(cors({origin: 'http://localhost:8888'}));
68
répondu Fabiano Soriani 2015-12-18 00:11:24

une autre façon, c'est simplement ajouter les en-têtes à votre itinéraire:

router.get('/', function(req, res) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
    res.setHeader('Access-Control-Allow-Credentials', true); // If needed

    res.send('cors problem fixed:)');
});
21
répondu Asaf Hananel 2018-05-10 06:32:12

Le réponse sommet a bien fonctionné pour moi, sauf que j'ai besoin de la liste blanche plus d'un domaine.

aussi, top answer souffre du fait que la demande OPTIONS n'est pas traitée par middleware et que vous ne l'obtenez pas automatiquement.

je stocke des domaines sur liste blanche comme allowed_origins en configuration Express et je mets le bon domaine selon origin en-tête car Access-Control-Allow-Origin ne permet pas de spécifier plus d'un seul domaine.

voilà ce que j'ai fini par dire:

var _ = require('underscore');

function allowCrossDomain(req, res, next) {
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');

  var origin = req.headers.origin;
  if (_.contains(app.get('allowed_origins'), origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
  }

  if (req.method === 'OPTIONS') {
    res.send(200);
  } else {
    next();
  }
}

app.configure(function () {
  app.use(express.logger());
  app.use(express.bodyParser());
  app.use(allowCrossDomain);
});
13
répondu Dan Abramov 2017-07-01 13:08:21

le code de réponse permet seulement de localhost:8888. Ce code ne peut pas être déployé dans la production, ou un autre nom de serveur et de port.

pour obtenir le fonctionnement pour toutes les sources, utilisez ceci à la place:

// Add headers
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*');

    // 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();
});
10
répondu Vicheanak 2016-07-06 17:31:24

installer la dépendance cors dans votre projet:

npm i --save cors

ajoutez à votre fichier de configuration de serveur ce qui suit:

var cors = require('cors');
app.use(cors());

il fonctionne pour moi avec 2.8.4 version cors.

3
répondu monikaja 2018-08-29 09:21:21
app.all('*', function(req, res,next) {
    /**
     * Response settings
     * @type {Object}
     */
    var responseSettings = {
        "AccessControlAllowOrigin": req.headers.origin,
        "AccessControlAllowHeaders": "Content-Type,X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5,  Date, X-Api-Version, X-File-Name",
        "AccessControlAllowMethods": "POST, GET, PUT, DELETE, OPTIONS",
        "AccessControlAllowCredentials": true
    };

    /**
     * Headers
     */
    res.header("Access-Control-Allow-Credentials", responseSettings.AccessControlAllowCredentials);
    res.header("Access-Control-Allow-Origin",  responseSettings.AccessControlAllowOrigin);
    res.header("Access-Control-Allow-Headers", (req.headers['access-control-request-headers']) ? req.headers['access-control-request-headers'] : "x-requested-with");
    res.header("Access-Control-Allow-Methods", (req.headers['access-control-request-method']) ? req.headers['access-control-request-method'] : responseSettings.AccessControlAllowMethods);

    if ('OPTIONS' == req.method) {
        res.send(200);
    }
    else {
        next();
    }


});
2
répondu Wiki 2015-12-21 12:51:03

vous pouvez utiliser" $http.jsonp"

ou

ci-dessous est le travail autour de chrome pour les tests locaux

vous devez ouvrir votre chrome avec la commande suivante. (Appuyez sur la fenêtre+R)

Chrome.exe --allow-file-access-from-files

Note: Votre chrome ne doit pas être ouvert. Lorsque vous exécutez cette commande chrome s'ouvre automatiquement.

Si vous entrez cette commande dans l'invite de commande, puis sélectionnez votre chrome répertoire d'installation alors utilisez cette commande.

ci-dessous code de script pour ouvrir chrome dans MAC avec "--allow-file-access - from-files "

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" 
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

options de seconde

vous pouvez juste utiliser ouvrir (1) pour ajouter les drapeaux: ouvrir -a 'Google Chrome' --args --allow-file-access-from-files

1
répondu JQuery Guru 2013-08-20 10:47:27

//Add following code in app.js of NODEJ Restful api to avoid "Access-Control-Allow-Origin" error in angular 6 or any other framework

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));
1
répondu Ezhil Arasan 2018-05-22 14:55:20

/**
 * Allow cross origin to access our /public directory from any site.
 * Make sure this header option is defined before defining of static path to /public directory
 */
expressApp.use('/public',function(req, res, next) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    // Request headers you wish to allow
    res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    // Set to true if you need the website to include cookies in the requests sent
    res.setHeader('Access-Control-Allow-Credentials', true);
    // Pass to next layer of middleware
    next();
});


/**
 * Server is about set up. Now track for css/js/images request from the 
 * browser directly. Send static resources from "./public" directory. 
 */
expressApp.use('/public', express.static(path.join(__dirname, 'public')));
If you want to set Access-Control-Allow-Origin to a specific static directory you can set the following.
0
répondu Luton Datta 2016-07-02 06:18:33