Usiłuję obsługiwać CORS w mojej aplikacji Node.js korzystającej z frameworka internetowego Express.js. Przeczytałem dyskusję grupy Google na temat tego, jak sobie z tym poradzić i przeczytałem kilka artykułów o tym, jak działa CORS. Najpierw zrobiłem to (kod jest napisany w składni CoffeeScript):
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'
# ...
Wydaje się, że to nie działa. Wygląda na to, że moja przeglądarka (Chrome) nie wysyła początkowego żądania OPTIONS. Kiedy właśnie zaktualizowałem blok zasobu, muszę przesłać żądanie GET krzyżowania do:
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'
# ...
Działa (w Chrome). Działa to również w przeglądarce Safari.
Przeczytałem, że ...
W przeglądarce implementującej CORS każde żądanie GET lub POST pochodzące z różnych źródeł poprzedza żądanie OPTIONS, które sprawdza, czy GET lub POST jest w porządku.
Więc moje główne pytanie brzmi: dlaczego tak się nie dzieje w moim przypadku? Dlaczego mój blok app.options nie jest wywoływany? Dlaczego muszę ustawić nagłówki w głównym bloku app.get?