it-swarm.com.de

Aktivieren der Cross-Origin-Ressourcennutzung (CORS) im express.js-Framework auf node.js

Ich versuche, einen Webserver in node.js zu erstellen, der domänenübergreifendes Scripting unterstützt und gleichzeitig statische Dateien aus einem öffentlichen Verzeichnis bereitstellt. Ich verwende die express.js und bin nicht wirklich sicher, wie das domänenübergreifende Scripting (Access-Control-Allow-Origin: *) zulässig ist.

Ich sah diesen Beitrag , was ich nicht hilfreich fand.

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

Check out das Beispiel von enable-cors.org :

Führen Sie in Ihrer ExpressJS-App auf node.js die folgenden Routen aus:

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
});

Der erste Aufruf (app.all) sollte vor allen anderen Routen in Ihrer App erfolgen (oder mindestens den Routen, für die CORS aktiviert werden soll).

[Bearbeiten]

Wenn Sie möchten, dass die Header auch für statische Dateien angezeigt werden, versuchen Sie Folgendes (stellen Sie sicher, dass es vor dem Aufruf von use(express.static()) ist:

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

Ich habe dies mit Ihrem Code getestet und die Header von Assets aus dem Verzeichnis public abgerufen:

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);

Sie können die Funktion natürlich in einem Modul zusammenfassen, um so etwas zu tun

// 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

Der @Michelle Tilley-Lösung folgend, funktionierte es anscheinend nicht für mich. Nicht sicher warum, vielleicht verwende ich Chrom und eine andere Version des Knotens. Nachdem ich ein paar kleinere Änderungen vorgenommen hatte, funktioniert es jetzt für mich. 

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

Falls jemand mit einem ähnlichen Problem wie meiner konfrontiert wird, kann dies hilfreich sein.

52
TonyTakeshi

Versuchen Sie es mit diesem cors npm Modul.

var cors = require('cors')

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

Dieses Modul bietet viele Funktionen zur Feinabstimmung der Kors-Einstellungen, z. B. das Whitelisting von Domänen, das Aktivieren von Kors für bestimmte Apis usw.

11
Zahid Rahman

Ich benutze das:

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);

dieser Code setzt voraus, dass sich Ihre Controller im Controller-Verzeichnis befinden. Jede Datei in diesem Verzeichnis sollte ungefähr so ​​aussehen:

module.exports = function(app){

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

}
2
Elmer

Empfehlen Sie die Verwendung des Moduls cors express. Auf diese Weise können Sie Domänen auf die Whitelist setzen, Domänen speziell für Routen zulassen/einschränken usw. 

1
Jerome Anthony

Sie müssen Access-Control-Allow-Credentials: true setzen, wenn Sie "Cookie" über "Credentials" verwenden möchten.

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