Node.js üzerindeki express.js çerçevesindeki kaynaklar arası kaynak paylaşımı (CORS) nasıl etkinleştirilir?


101

Node.js'de, genel bir dizinden statik dosyalar sağlarken, etki alanları arası komut dosyasını destekleyecek bir web sunucusu oluşturmaya çalışıyorum. Express.js kullanıyorum ve etki alanları arası komut dosyası oluşturmaya ( Access-Control-Allow-Origin: *) nasıl izin vereceğimi tam olarak bilmiyorum .

Yararlı bulmadığım bu gönderiyi gördüm .

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

App.all ile app.get karşılaştırmasına dikkat edin. SEÇENEKLER isteği GET değil
Shimon Doodkin

bkz yerel web sunucusu CORS'yi destekleyen basit düğüm, statik web sunucusu bir örnek için
Lloyd

Daha fazla bilgi için enable-cors.org/server_apache.html'ye bakın
Mostafa

"Access-Control-Allow-Origin", "*"API'nizi kimlik avı uygulamaları için ilginç hale getirir. Yalnızca bilinen kökenlere izin vermeyi düşünün.
Martin Schneider

Yanıtlar:


159

Check out enable-cors.org dan örnek :

Node.js üzerindeki ExpressJS uygulamanızda, rotalarınızda aşağıdakileri yapın:

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

İlk çağrı ( app.all), uygulamanızdaki diğer tüm rotalardan (veya en azından CORS etkin olmasını istediklerinizden) önce yapılmalıdır.

[Düzenle]

Başlıkların statik dosyalar için de görünmesini istiyorsanız, bunu deneyin (şunu yapma çağrısından önce olduğundan emin olun 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();
});

Bunu kodunuzla test ettim ve publicdizindeki varlıkların başlıklarını aldım :

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

Elbette, işlevi bir modüle paketleyebilirsiniz, böylece şöyle bir şey yapabilirsiniz:

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

Hey, cevabın için teşekkürler. Önerdiğiniz şeyi yaptım (ilk kısım, ancak istek başlıklarında hala farklı bir şey görmüyorum) Mevcut kodumu yukarıya ekledim. Çözümünüzün geri kalanını buna nasıl entegre edebileceğimi açıklayabilir misiniz?
Guy

1
Ben, o şaşırdım Eğer konum beri useing app.routerönce express.staticstatik dosyalar için başlıklarını değiştirmek etmediğini; her durumda, cevabımı işe yarayacak şekilde güncelledim.
Michelle Tilley

Teşekkürler! Haklı olduğunu görüyorum. Varlıklar sunucudan alınır ve istenen başlıklarla olur. Asıl sorunum konusunda net olamamış olabilirim. Get komutu ile harici bir sunucuya API çağrısı yapmaya çalışıyorum. ve burada hatayı alıyorum: XMLHttpRequest SOMEURL.com'u yükleyemiyor . Origin localhost: 8888'e Access-Control-Allow-Origin tarafından izin verilmiyor.
Guy

Yanlış anlaşılıyor olabilirim. SOMEURL.com'daki sunucunun kontrolü sizde mi?
Michelle Tilley

Üzgünüm şimdi cevabınızı tamamen anlıyorum. Çok teşekkürler. Yardımın için minnettarım :)
Guy

58

@Michelle Tilley çözümünün ardından, görünüşe göre ilk başta benim için işe yaramadı. Neden olduğundan emin değilim, belki Chrome ve farklı düğüm sürümünü kullanıyorum. Bazı küçük ayarlamalar yaptıktan sonra, şimdi benim için çalışıyor.

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

Birisinin benimkine benzer bir sorunla karşılaşması durumunda, bu yardımcı olabilir.


App.all ile app.get karşılaştırmasına dikkat edin. SEÇENEKLER isteği GET değil
Shimon Doodkin

Bu benim için çalışıyor (Backbone kullanarak nesneleri getiriyorum). IE 8'de çalışıp çalışmayacağını anlamaya çalışıyorum ... olması gerektiği gibi görünüyor, ancak bu "XDomainRequest" şeyi için özel bir şey gerekip gerekmediğini bilmiyorum ... developer.mozilla.org/en- US / docs / HTTP /…
Adam Loving

GELECEKTEKİ KULLANICILAR İÇİN BAZI BİLGİLER: Alan adımı bir heroku deposuna yeniden yönlendiriyorum, bu yüzden bu sorunla karşılaştım. Her neyse, ilk cevap yerel olarak işe yaradı ama onu heroku'ya ittikten sonra olmadı. Ancak bu cevap, heroku'ya geçtikten sonra işe yaradı.
Kris Hollenbeck

@KrisHollenbeck Bu benim için heroku üzerinde çalışmıyor, başka bir şey yaptın mı?
Ben Craig

@BenCraig, Hayır, ama aslında ilk denemeden sonra benim için çalışmayı bıraktı. Yani aslında hala bu sorunu yaşıyorum.
Kris Hollenbeck

11

Bu cors npm modüllerini deneyin .

var cors = require('cors')

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

Bu modül, alan adı beyaz listesi, belirli apiler için cors sağlama vb. Gibi cors ayarlarına ince ayar yapmak için birçok özellik sağlar.


2

Bunu kullanıyorum:

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

bu kod, denetleyicilerinizin denetleyiciler dizininde bulunduğunu varsayar. bu dizindeki her dosya şu şekilde olmalıdır:

module.exports = function(app){

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

}

1

Cors express modülünü kullanmanızı öneririz . Bu, alanları beyaz listeye eklemenize, alan adlarına özellikle rotalarla izin vermenize / kısıtlamanıza vb. Olanak tanır.


0

Access-Control-Allow-Credentials: true"Credentials" aracılığıyla "cookie" kullanmak istiyorsanız, ayarlamalısınız.

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
app.use(function(req, res, next) {
var allowedOrigins = [
  "http://localhost:4200"
];
var origin = req.headers.origin;
console.log(origin)
console.log(allowedOrigins.indexOf(origin) > -1)
// Website you wish to allow to
if (allowedOrigins.indexOf(origin) > -1) {
  res.setHeader("Access-Control-Allow-Origin", origin);
}

// res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

// Request methods you wish to allow
res.setHeader(
  "Access-Control-Allow-Methods",
  "GET, POST, OPTIONS, PUT, PATCH, DELETE"
);

// Request headers you wish to allow
res.setHeader(
  "Access-Control-Allow-Headers",
  "X-Requested-With,content-type,Authorization"
);

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader("Access-Control-Allow-Credentials", true);

// Pass to next layer of middleware
next();

});

Bu kodu index.js veya server.js dosyanıza ekleyin ve izin verilen kaynak dizisini ihtiyacınıza göre değiştirin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.