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. Anscheinend sendet mein Browser (Chrome) die anfängliche OPTIONS-Anfrage nicht. Als ich gerade den Block für die Ressource aktualisiert habe, muss ich eine ursprungsübergreifende 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). Das funktioniert auch im Safari.
das habe ich gelesen...
In einem Browser, der CORS implementiert, geht jeder ursprungsübergreifenden 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 Haupt-app.get-Block festlegen?
Lösung des Problems
Ich fand den einfachsten Weg, das node.js-Paket cors zu verwenden. Die einfachste Verwendung ist:
var cors = require('cors')
var app = express()
app.use(cors())
Es gibt natürlich viele Möglichkeiten, das Verhalten an Ihre Bedürfnisse anzupassen; Die oben verlinkte Seite zeigt einige Beispiele.
Keine Kommentare:
Kommentar veröffentlichen