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);
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());
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.
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.
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');
});
}
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.,
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();
});