Pertanyaan Izinkan permintaan CORS REST ke aplikasi Express / Node.js di Heroku


Saya telah menulis REST API pada kerangka kerja ekspres untuk node.js yang berfungsi untuk permintaan dari konsol js di Chrome, dan bilah URL, dll. Saya sekarang mencoba membuatnya bekerja untuk permintaan dari aplikasi lain, pada yang berbeda domain (CORS).

Permintaan pertama, dibuat secara otomatis oleh ujung depan javascript, adalah / api / cari? Uri =, dan tampaknya gagal pada permintaan OPTIONS "preflight".

Di aplikasi ekspres saya, saya menambahkan tajuk CORS, menggunakan:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};

dan:

app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.static(path.join(application_root, "public")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

Dari konsol Chrome, saya mendapatkan tajuk ini:

URL permintaan: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1

Metode Permintaan: OPSI

Kode Status: 200 OK

Minta Header

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

Parameter String Kueri

uri:http://localhost:5000/collections/1/documents/1

Header Respon

Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express

Apakah ini terlihat seperti kurangnya header yang dikirim oleh aplikasi API?

Terima kasih.


76
2018-06-12 17:33


asal


Jawaban:


Saya telah mencek kode Anda pada aplikasi ExpressJS yang bersih dan itu bekerja dengan baik.

Coba gerakkan app.use(allowCrossDomain) ke bagian atas fungsi konfigurasi.


51
2018-06-15 20:16



untuk mendukung cookie dengan kredensial, Anda memerlukan baris ini xhr.withCredentials = true;

mdn docs xhr.withCredentials

Di Server Ekspres, tambahkan blok ini sebelum yang lainnya

`app.all('*', function(req, res, next) {
     var origin = req.get('origin'); 
     res.header('Access-Control-Allow-Origin', origin);
     res.header("Access-Control-Allow-Headers", "X-Requested-With");
     res.header('Access-Control-Allow-Headers', 'Content-Type');
     next();
});`

3
2017-09-15 08:08



Tidak dapat menjadi kasus bagi kebanyakan orang yang menjelajahi pertanyaan ini tetapi saya memiliki masalah yang sama persis dan solusinya tidak terkait CORS.

Ternyata rahasia JSON Web Token string tidak didefinisikan dalam variabel lingkungan, sehingga token tidak dapat ditandatangani. Ini disebabkan untuk apa pun POST permintaan yang bergantung pada pemeriksaan atau penandatanganan token untuk mendapatkan batas waktu dan mengembalikan a 503 kesalahan, memberi tahu browser bahwa ada sesuatu yang salah CORS, yang tidak. Menambahkan variabel lingkungan di Heroku memecahkan masalah.

Saya harap ini membantu seseorang.


0
2017-07-18 00:05