Frage Erlaube CORS REST-Anfrage an eine Express / Node.js-Anwendung auf Heroku


Ich habe eine REST-API auf dem Express-Framework für node.js geschrieben, die für Anfragen von der js-Konsole in Chrome und der URL-Leiste usw. verwendet wird. Ich versuche nun, es für Anfragen von einer anderen App auf einer anderen App zu bekommen Domäne (CORS).

Die erste Anfrage, die automatisch vom Javascript-Frontend gestellt wird, lautet / api / search? Uri =, und scheint bei der "preflight" -Option OPTIONS fehlgeschlagen zu sein.

In meiner Express-App füge ich CORS-Header hinzu mit:

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

und:

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

Von der Chrome-Konsole bekomme ich diese Header:

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

Anfrage Methode: OPTIONEN

Statuscode: 200 OK

Kopfzeilen anfragen

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

Abfrage String-Parameter

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

Antwortheader

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

Sieht das so aus, als ob die richtigen Header nicht von der API-Anwendung gesendet werden?

Vielen Dank.


76
2018-06-12 17:33


Ursprung


Antworten:


Ich habe Ihren Code auf einer sauberen ExpressJS-App überprüft und es funktioniert gut.

Versuchen Sie, Ihre app.use(allowCrossDomain) an den Anfang der Konfigurationsfunktion.


51
2018-06-15 20:16



Um Cookies mit Credentials zu unterstützen, benötigen Sie diese Zeile xhr.withCredentials = true;

mdn docs xhr.withCredentials

Fügen Sie diesen Block vor dem anderen im Express Server hinzu

`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



Es könnte nicht der Fall sein für die meisten Leute, die diese Frage durchgehen, aber ich hatte genau dasselbe Problem und die Lösung war nicht damit verbunden CORS.

Stellt sich heraus, dass JSON Web Token geheim ist string wurde in den Umgebungsvariablen nicht definiert, daher konnte das Token nicht signiert werden. Dies hat zu irgendwelchen geführt POST Anfrage, die darauf angewiesen ist, ein Token zu prüfen oder zu signieren, um eine Zeitüberschreitung zu erhalten und a zurückzugeben 503 Fehler, der dem Browser mitteilt, dass etwas nicht stimmt CORSwas es nicht ist. Das Hinzufügen der Umgebungsvariablen in Heroku hat das Problem gelöst.

Ich hoffe, das hilft jemandem.


0
2017-07-18 00:05