Tôi đang cố gắng hỗ trợ CORS trong ứng dụng Node.js sử dụng khung web Express.js. Tôi đã đọc một cuộc thảo luận nhóm của Google về cách xử lý việc này và đọc một vài bài viết về cách thức hoạt động của CORS. Đầu tiên, tôi đã làm điều này (mã được viết theo cú pháp 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'
# ...
Nó dường như không hoạt động. Có vẻ như trình duyệt của tôi (Chrome) không gửi yêu cầu TÙY CHỌN ban đầu. Khi tôi vừa cập nhật khối cho tài nguyên, tôi cần gửi yêu cầu GET nguồn gốc chéo tới:
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'
# ...
Nó hoạt động (trong Chrome). Điều này cũng hoạt động trong Safari.
Tôi đã đọc rằng ...
Trong trình duyệt triển khai CORS, mỗi yêu cầu GET hoặc POST có nguồn gốc chéo được bắt đầu bằng một yêu cầu TÙY CHỌN để kiểm tra xem GET hoặc POST có ổn không.
Vì vậy, câu hỏi chính của tôi là, tại sao điều này dường như không xảy ra trong trường hợp của tôi? Tại sao khối app.options của tôi không được gọi? Tại sao tôi cần đặt các tiêu đề trong khối app.get chính của mình?