web-dev-qa-db-fra.com

Comment activer le partage de ressources inter-origines (CORS) dans le cadre express.js sur node.js

J'essaie de créer un serveur Web dans node.js qui prend en charge les scripts entre domaines tout en fournissant des fichiers statiques à partir d'un répertoire public. J'utilise express.js et je ne sais pas vraiment comment autoriser les scripts interdomaines (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);
91
Guy

Découvrez l'exemple de enable-cors.org :

Dans votre application ExpressJS sur node.js, procédez comme 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 effectué avant tous les autres itinéraires de votre application (ou au moins ceux que vous souhaitez activer pour CORS).

[Modifier]

Si vous voulez que les en-têtes apparaissent également pour les fichiers statiques, essayez ceci (assurez-vous que c'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 les en-têtes des ressources 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 intégrer la fonction dans un module afin de pouvoir 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());
154
Michelle Tilley

Après la solution de @Michelle Tilley, cela n’a apparemment pas fonctionné pour moi au début. Je ne sais pas pourquoi, j'utilise peut-être du chrome et une version différente du noeud. Après quelques ajustements mineurs, cela fonctionne 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();
});

Si quelqu'un rencontrait un problème similaire au mien, cela pourrait être utile.

52
TonyTakeshi

Essayez ces modules cors npm.

var cors = require('cors')

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

Ce module fournit de nombreuses fonctionnalités pour ajuster les paramètres cors tels que la liste blanche de domaines, l'activation des cors pour des apis spécifiques, etc.

11
Zahid Rahman

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 des contrôleurs. chaque fichier de ce répertoire devrait ressembler à ceci:

module.exports = function(app){

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

}
2
Elmer

Recommandez d’utiliser le module cors express. Cela vous permet d’ajouter à la liste blanche des domaines, d’autoriser/restreindre des domaines à des itinéraires, etc., 

1
Jerome Anthony

Vous devez définir Access-Control-Allow-Credentials: true, si vous souhaitez utiliser "cookie" via "Identifiants"

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
dukegod