Ich versuche, CORS in meiner Node.js-Anwendung zu unterstützen, die das Express.js-Webframework verwendet. Ich habe eine Google-Gruppendiskussion darüber gelesen, wie man damit umgeht, und einige Artikel darüber gelesen, wie CORS funktioniert. Zuerst habe ich dies getan (Code ist in CoffeeScript-Syntax geschrieben):
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Es scheint nicht zu funktionieren. Es scheint, dass mein Browser (Chrome) die erste OPTIONS-Anfrage nicht sendet. Wenn ich gerade den Block für die Ressource aktualisiert habe, muss ich eine originenspezifische GET-Anfrage senden an:
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Es funktioniert (in Chrome). Dies funktioniert auch in Safari.
Ich habe das gelesen ...
In einem Browser, der CORS implementiert, geht jeder originalen GET- oder POST-Anforderung eine OPTIONS-Anforderung voraus, die prüft, ob GET oder POST in Ordnung ist.
Meine Hauptfrage ist also, warum scheint dies in meinem Fall nicht zu passieren? Warum wird mein app.options-Block nicht aufgerufen? Warum muss ich die Header in meinem Hauptblock app.get festlegen?
quelle
Antworten:
Um Ihre Hauptfrage zu beantworten, muss in der CORS-Spezifikation der Aufruf OPTIONS nur vor dem POST oder GET stehen, wenn der POST oder GET nicht einfache Inhalte oder Überschriften enthält.
Inhaltstypen, für die eine CORS-Anforderung vor dem Flug erforderlich ist (der OPTIONS-Aufruf), sind alle Inhaltstypen mit Ausnahme der folgenden :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Alle anderen Inhaltstypen außer den oben aufgeführten lösen eine Anfrage vor dem Flug aus.
Bei Headern lösen alle Anforderungsheader außer den folgenden eine Anforderung vor dem Flug aus:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
Alle anderen Anforderungsheader lösen die Anforderung vor dem Flug aus.
Sie können also einen benutzerdefinierten Header wie: hinzufügen
x-Trigger: CORS
, der die Anforderung vor dem Flug auslösen und den Block OPTIONS drücken soll.Siehe MDN-Web-API-Referenz - CORS Preflighted-Anforderungen
quelle
OPTIONS
Blöcke nicht senden. Wäre schön, wenn es die Liste der akzeptiertenHEADERS
odercontent-types
erforderlichenOPTIONS
usw. hätte, aber es ist ein guter AnfangIch fand den einfachsten Weg, das Paket cors von node.js zu verwenden . Die einfachste Verwendung ist:
Es gibt natürlich viele Möglichkeiten, das Verhalten an Ihre Bedürfnisse anzupassen. Die oben verlinkte Seite zeigt eine Reihe von Beispielen.
quelle
cors({credentials: true, origin: true})
Versuchen Sie, die Kontrolle an die nächste passende Route weiterzugeben. Wenn Express zuerst mit app.get route übereinstimmt, wird die Optionsroute erst fortgesetzt, wenn Sie dies tun (beachten Sie die Verwendung von next) :
In Bezug auf die Organisation des CORS-Materials habe ich es in eine Middleware gesteckt, die für mich gut funktioniert:
quelle
config.allowedDomains
eine durch Kommas getrennte Zeichenfolge oder ein Array?In der gleichen Idee des Routings bleiben. Ich benutze diesen Code:
Ähnlich wie im Beispiel http://enable-cors.org/server_expressjs.html
quelle
tun
und fügen Sie einfach diese Zeilen in Ihre Hauptdatei ein, in die Ihre Anfrage geht (bewahren Sie sie vor jeder Route auf).
quelle
app.options('*', cors())
// vor anderen Routen einschließenIch habe eine vollständigere Middleware erstellt, die für Express oder Connect geeignet ist. Es unterstützt
OPTIONS
Anfragen zur Preflight-Prüfung. Beachten Sie, dass CORS dadurch auf alles zugreifen kann. Möglicherweise möchten Sie einige Überprüfungen durchführen, wenn Sie den Zugriff einschränken möchten.quelle
Installieren Sie das cors-Modul von expressjs. Sie können diese Schritte ausführen>
Installation
Einfache Verwendung (Alle CORS-Anfragen aktivieren)
Weitere Informationen finden Sie unter https://github.com/expressjs/cors
quelle
TypeError: Cannot read property 'headers' of undefined
Das grundlegendste App-Setup.Mach so etwas:
quelle
Tests werden mit Express + Node + Ionic durchgeführt, die in verschiedenen Ports ausgeführt werden.
Localhost:8100
Localhost:5000
quelle
Installieren Sie zunächst einfach cors in Ihrem Projekt. Nehmen Sie das Terminal (Eingabeaufforderung) und
cd
in Ihr Projektverzeichnis und führen Sie den folgenden Befehl aus:Nehmen Sie dann die Datei server.js und ändern Sie den Code, um Folgendes hinzuzufügen:
Das hat bei mir funktioniert ..
quelle
cors
wenn Sie dasres.header
Zeug machen.cors
ist eine Bibliothek, die all das für Sie erledigt. Löschen Sie Ihre erste und dritte Zeile (AKA alles mitcors
) und Sie werden feststellen, dass es immer noch funktioniert.res.header("Access-Control-Allow-Origin", "*");
Dies funktioniert für mich, da es eine einfache Implementierung innerhalb der Routen ist, ich verwende meanjs und es funktioniert gut, Safari, Chrom usw.
quelle
Vor einiger Zeit war ich mit diesem Problem konfrontiert und habe dies getan, um CORS in meiner nodejs-App zuzulassen:
Zuerst müssen Sie mit dem folgenden Befehl installieren
cors
:Fügen Sie nun den folgenden Code zu Ihrer App-Startdatei hinzu, z. B. (
app.js or server.js
)quelle
In meinem habe
index.js
ich hinzugefügt:quelle
Access-Control-Allow-Origin = *
bedeutet, dass Sie keine Cookies an den Server senden können. Sie werden von der CORS-Richtlinie abgelehnt - Quelle: developer.mozilla.org/en-US/docs/Web/HTTP/… . Verwenden Sie dies also nicht, wenn Sie Cookies verwenden möchten.Wenn Sie den Controller spezifisch machen möchten, können Sie Folgendes verwenden:
Bitte beachten Sie, dass dies auch Iframes erlaubt.
quelle
Kann den Code unten für das gleiche beziehen. Quelle: Academind / node-restful-api
quelle
const app = express();
und funktioniert! Ich denke, es ist wichtig, es zu erwähnen.Meine einfachste Lösung mit Express 4.2.0 (BEARBEITEN: Scheint in 4.3.0 nicht zu funktionieren) war:
Ich nehme an, das
app.all('/result', ...)
würde auch funktionieren ...quelle
Die einfachste Antwort ist, einfach das cors-Paket zu verwenden .
Dadurch wird CORS auf ganzer Linie aktiviert. Wenn Sie lernen möchten, wie Sie CORS ohne externe Module aktivieren , benötigen Sie lediglich eine Express-Middleware , die den Header "Access-Control-Allow-Origin" festlegt . Dies ist das Minimum, das Sie benötigen, um Cross-Request-Domains von einem Browser auf Ihren Server zuzulassen.
quelle
Die Verwendung von Express Middleware funktioniert für mich hervorragend. Wenn Sie Express bereits verwenden, fügen Sie einfach die folgenden Middleware-Regeln hinzu. Es sollte anfangen zu arbeiten.
Referenz
quelle
Unten hat es für mich funktioniert, hoffe es hilft jemandem!
Referenz von https://expressjs.com/en/resources/middleware/cors.html#configuring-cors
quelle
Ich fand es extrem einfach, dies mit dem npm-Anforderungspaket ( https://www.npmjs.com/package/request) zu tun )
Dann habe ich meine Lösung auf diesen Beitrag gestützt http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
quelle
In Typoskript, wenn Sie das Paket node.js cors verwenden möchten
Wenn Sie keine Bibliotheken von Drittanbietern für die Behandlung von Cors-Fehlern verwenden möchten, müssen Sie die Methode handleCORSErrors () ändern.
Zur Verwendung der Datei app.ts.
quelle
Dies ähnelt Pats Antwort mit dem Unterschied, dass ich mit res.sendStatus (200) fertig bin. statt next ();
Der Code fängt alle Anforderungen des Methodentyps OPTIONS ab und sendet Access-Control-Header zurück.
Der Code akzeptiert CORS aller Herkunft, wie in der Frage gefordert. Es ist jedoch besser, das * durch einen bestimmten Ursprung zu ersetzen, z. B. http: // localhost: 8080 , um Missbrauch zu verhindern.
Da wir die app.options-Methode anstelle der app.use-Methode verwenden, müssen wir diese Prüfung nicht durchführen:
was wir in einigen der anderen Antworten sehen können.
Ich fand die Antwort hier: http://johnzhang.io/options-request-in-express .
quelle
Sie können Express-Middleware verwenden, Ihre Domain und Methoden blockieren.
quelle
Wir können CORS vermeiden und die Anforderungen stattdessen an den anderen Server weiterleiten:
quelle
Ich habe die folgenden Schritte für meine Web-App ausgeführt und hatte Erfolg:
Fügen Sie das cors-Paket zum Express hinzu:
Fügen Sie nach der bodyParser-Konfiguration die folgenden Zeilen hinzu . Ich hatte einige Probleme beim Hinzufügen vor bodyParser:
quelle
Am einfachsten ist es, das cors-Modul in Ihrem Projekt zu installieren, indem Sie Folgendes verwenden:
Importieren Sie es dann in Ihre Serverdatei wie folgt:
Verwenden Sie es dann einfach als Middleware wie folgt:
Hoffe das hilft!
quelle
Wenn ich Sie @OP wäre, würde ich mein Programmierparadigma ändern.
Angenommen, Sie blockieren diese CORS, weil Sie Anfragen an localhost oder ähnliches richten.
Wenn Sie in der Produktion Optoins wie
Google Cloud Platform
oderHeroku
oder bereitstellen möchten , müssen Sie sich keine Gedanken über CORS machen, z. B. Herkunft zulassen oder was auch immer, wenn Sie in der Produktion sind.Wenn Sie den Server testen, verwenden
postman
Sie ihn einfach und Sie werden CORS nicht blockieren. Stellen Sie anschließend Ihren Server bereit und arbeiten Sie dann an Ihrem Client.quelle
/ * Zuallererst, und dies könnte das Problem bei Junior-Entwicklern da draußen sein, wie ich selbst: Stellen Sie sicher, dass Sie "Lambda" >>>> "` "und nicht" '"in Ihrem Abruf verwenden verwenden! * /
`` `const response = warte auf fetch (
https://api....
);/ plus, der folgende Artikel wird dringend empfohlen: https://developer.edamam.com/api/faq /
quelle
einfach ist schwer:
quelle
Versuchen Sie dies in Ihrer Haupt-JS-Datei:
Dies sollte Ihr Problem lösen
quelle