Comment activer le partage des ressources entre les origines (CORS) dans l'express.js-cadre sur le nœud.js

j'essaie de construire un serveur web dans node.js qui supporte les scripts de domaines croisés, tout en fournissant des fichiers statiques à partir d'un répertoire public. Je suis à l'aide de l'express.js et am ne savent pas vraiment comment autoriser les scripts de domaines croisés ( Access-Control-Allow-Origin: * ).

j'ai vu ce post , que je n'ai pas trouvé utile.

var express = require('express')
  , app = express.createServer();

app.get('/', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
});

app.configure('development', function () {

    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {


    var oneYear = 31557600000;
    //    app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);
89
demandé sur Community 2012-06-25 01:59:26

7 réponses

Check out l'exemple de enable-cors.org :

dans votre application ExpressJS sur node.js, faites ce qui suit avec vos itinéraires:

app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});

le premier appel ( app.all ) doit être fait avant toutes les autres routes de votre application (ou au moins celles que vous voulez activer CORS).

[Modifier]

si vous voulez que les en-têtes se présentent pour fichiers statiques ainsi, essayez ceci (assurez-vous qu'il est avant l'appel à use(express.static()) :

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

j'ai testé cela avec votre code, et j'ai obtenu les en-têtes sur les actifs du répertoire public :

var express = require('express')
  , app = express.createServer();

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      next();
    });
    app.use(app.router);
});

app.configure('development', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

vous pouvez, bien sûr, empaqueter la fonction dans un module de sorte que vous pouvez faire quelque chose comme

// cors.js

module.exports = function() {
  return function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
  };
}

// server.js

cors = require('./cors');
app.use(cors());
147
répondu Michelle Tilley 2015-05-21 15:33:20

suite à @Brandon Tilley solution, apparemment ça n'a pas marché pour moi au début. Je ne sais pas pourquoi, peut-être que j'utilise chrome et une version différente de node. Après quelques modifications mineures, ça marche pour moi maintenant.

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

dans le cas où quelqu'un fait face à la même question que la mienne, cela pourrait être utile.

49
répondu TonyTakeshi 2012-07-23 07:10:08

Essayer à cette cors npm modules.

var cors = require('cors')

var app = express()
app.use(cors())

ce module fournit de nombreuses fonctionnalités pour affiner le réglage des cors telles que la liste blanche des domaines, l'activation des cors pour les API spécifiques, etc.

10
répondu Zahid Rahman 2016-09-13 19:41:14

j'utilise ceci:

var app = express();

app
.use(function(req, res, next){
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With');
    next();
})
.options('*', function(req, res, next){
    res.end();
})
;

h.readFiles('controllers').forEach(function(file){
  require('./controllers/' + file)(app);
})
;

app.listen(port);
console.log('server listening on port ' + port);

ce code suppose que vos contrôleurs sont situés dans le répertoire controllers. chaque fichier dans ce répertoire devrait être quelque chose comme ceci:

module.exports = function(app){

    app.get('/', function(req, res, next){
        res.end('hi');
    });

}
2
répondu Elmer 2013-04-05 10:31:59

recommande d'utiliser le module express cors . Cela vous permet d'énumérer les domaines, d'autoriser / restreindre les domaines spécifiquement aux routes,etc.,

1
répondu Jerome Anthony 2015-11-12 22:50:20

Vous devez définir Access-Control-Allow-Credentials: true , si vous souhaitez utiliser des "cookies" par "informations d'Identification"

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});
0
répondu dukegod 2018-01-17 03:16:58

une autre étape que j'ai dû faire était de changer mon URL de http://localhost à http://127.0.0.0

-5
répondu user3795430 2014-07-01 20:54:35