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);
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());
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.
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.
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');
});
}
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.,
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();
});
une autre étape que j'ai dû faire était de changer mon URL de http://localhost
à http://127.0.0.0