Ich versuche, CORS in meiner Node.js-Anwendung zu unterstützen, die das Express.js-Webframework verwendet. Ich habe gelesen eine Google-Gruppendiskussion darüber, wie dies zu handhaben ist, und lesen Sie einige Artikel über die Funktionsweise von CORS. Zunächst habe ich dies getan (der 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 anfängliche OPTIONS-Anfrage nicht sendet. Wenn ich gerade den Block für die Ressource aktualisiert habe, an die ich eine herkunftsübergreifende GET-Anforderung senden muss:
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 gelesen, dass...
In einem Browser, der CORS implementiert, wird jeder herkunftsübergreifenden GET- oder POST-Anfrage eine OPTIONS-Anfrage vorangestellt, die prüft, ob der GET oder POST OK ist.
Meine Hauptfrage ist also, wie kommt es, dass dies in meinem Fall nicht zu passieren scheint? Warum wird mein app.options-Block nicht aufgerufen? Warum muss ich die Header in meinem Haupt app.get-Block festlegen?