2015-09-20 6 views
7

Ich versuche, ein POST meine API von einem AngularJS Client zu machen, ich habe diese Konfiguration auf dem Server, der in einer anderen Domäne ausgeführt wird:CORS - http OPTIONS Fehler mit kantigen und Express

app.use(function(req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS, DETELE'); 
    res.setHeader('Access-Control-Allow-Headers', '*'); 
    next(); 
}); 

Das Header an den Server gesendet werden sollen:

OPTIONS /api/authenticate HTTP/1.1 
Host: xxxx.herokuapp.com 
Connection: keep-alive 
Access-Control-Request-Method: POST 
Origin: http://127.0.0.1:5757 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 
Access-Control-Request-Headers: accept, content-type 
Accept: */* 
Referer: http://127.0.0.1:5757/login 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en,es;q=0.8,gl;q=0.6,pt;q=0.4 

die Response-Header sind:

HTTP/1.1 403 Forbidden 
Server: Cowboy 
Connection: keep-alive 
X-Powered-By: Express 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DETELE 
Access-Control-Allow-Headers: X-Requested-With,content-type,Authorization 
Content-Type: application/json; charset=utf-8 
Content-Length: 47 
Etag: W/"2f-5f255986" 
Date: Sun, 20 Sep 2015 19:26:56 GMT 
Via: 1.1 vegur 

Und was ich in der Chrome-c Onsole ist:

+0

Haben Sie versucht, die Cors-Konfiguration am Anfang (vor bodyParsing, Router, methodOverride, etc.) zu setzen? Schau mal hier: http://stackoverflow.com/questions/11001817/allow-cors-rest-request-to-a-express-node-js-application-on-heroku Hoffe es hilft –

Antwort

10

In der Tat erlauben die meisten Browser für Sicherheitsprinzipien clientseitige js-Code Ressource aus demselben Host anfordern.

Es ist jedoch zulässig, wenn der Ressourcenbesitzer dem Client-Browser mitteilt, dass seine Ressourcen freigegeben wurden, indem er Header für Cross Origin Resource Sharing als Antwort hinzufügt.

Um nicht mit den Kopfzeilen zu raten, verwenden Sie das Paket cors - es wird alle schmutzigen Jobs für Sie erledigen.

npm install cors --save 

und dann:

var express = require('express') 
    , cors = require('cors') 
    , app = express(); 

app.use(cors()); 

, dass alle :) ist

zusätzliche docs hier: https://www.npmjs.com/package/cors

+0

Kannst du mir was erklären habe ich falsch gemacht und warum funktioniert das? –

+3

Cors Modul tut das gleiche wie Sie, aber Sie haben die meisten Regeln nicht definiert. Sie können es hier lesen: https://github.com/expressjs/cors/blob/master/lib/index.js – num8er

+1

oder zu überprüfen: Öffnen Sie Chrom und untersuchen Header, die Cors Modul sendet und schreiben Sie die gleichen Header zu Ihrem Code und entfernen Cors Modul. – num8er

0

Ich sehe, dass dieses Thema ein wenig älter ist, aber ich fand ein kleiner Tippfehler in Ihrem ACCESS-CONTROL-ALLOW-METHODS.

Ich wollte nur diese mit einem ähnlichen Problem für andere Benutzer teilen, wenn sie & Paste kopieren:

Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DETELE 

Es ist ein Tippfehler in DELETE.