Câu hỏi Cho phép CORS REST yêu cầu một ứng dụng Express / Node.js trên Heroku


Tôi đã viết một API REST trên khung công tác nhanh cho node.js hoạt động cho các yêu cầu từ bảng điều khiển js trong Chrome và thanh URL, v.v. Tôi hiện đang cố gắng làm cho nó hoạt động cho các yêu cầu từ một ứng dụng khác, trên một ứng dụng khác miền (CORS).

Yêu cầu đầu tiên, được thực hiện tự động bởi giao diện người dùng javascript, là / api / search? Uri =, và có vẻ thất bại trong yêu cầu OPTIONS "preflight".

Trong ứng dụng nhanh của tôi, tôi đang thêm tiêu đề CORS, sử dụng:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};

và:

app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.static(path.join(application_root, "public")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

Từ bảng điều khiển Chrome, tôi nhận được các tiêu đề sau:

URL yêu cầu: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1

Phương thức yêu cầu: OPTIONS

Mã trạng thái: 200 OK

Yêu cầu tiêu đề

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

Tham số chuỗi truy vấn

uri:http://localhost:5000/collections/1/documents/1

Tiêu đề phản hồi

Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express

Điều này có giống như thiếu các tiêu đề thích hợp được gửi bởi ứng dụng API không?

Cảm ơn.


76
2018-06-12 17:33


gốc


Tôi nhận được lỗi này trong một mã tôi đã không viết, nhưng tôi không hiểu sự cần thiết của một xử lý cho OPTIONS phương pháp. Ai đó có thể giúp tôi hiểu tại sao không chỉ xử lý POST phương pháp thay vì xử lý cả hai POST  và  OPTIONS phương pháp? - Ulysses Alves


Các câu trả lời:


Tôi đã cheked mã của bạn trên một ứng dụng ExpressJS sạch và nó hoạt động tốt.

Hãy thử di chuyển của bạn app.use(allowCrossDomain) lên trên cùng của hàm cấu hình.


51
2018-06-15 20:16



Lý do nó là vì bạn cần phải xác định nó trước khi app.use(app.router); Chúc mừng! - Michal
Trong trường hợp của tôi, POST tiếp theo không được gọi sau khi gửi lại res.send (200) khi req.method == 'OPTIONS'. Tôi có thiếu gì khác không? - Aldo
var cors = require('cors'); app.use(cors()); cũng hoạt động - Connor Leech
@ ConnorLeech Rất đẹp. Tôi đã làm phương pháp allowCrossDomain như trên và đã mệt mỏi vì phải đối phó với tất cả các tiêu đề mgmt đó. Ngoài ra - vì chúng tôi chỉ cần CORS cho dev, không có ý nghĩa gì để cống hiến rất nhiều chu kỳ để tìm ra những gì đang diễn ra. Rất vui khi có hỗ trợ node.js để dễ dàng cho phép điều này. - Stevus
@ ConnorLeech Tôi nghĩ rằng bạn nên thêm bình luận của bạn như một câu trả lời ... hoạt động như một điều trị, và nó đẹp và đơn giản - drmrbrewer


để hỗ trợ cookie vớiCredentials bạn cần dòng này xhr.withCredentials = true;

mdn docs xhr.withCredentials

Trong Express Server, hãy thêm khối này trước tất cả

`app.all('*', function(req, res, next) {
     var origin = req.get('origin'); 
     res.header('Access-Control-Allow-Origin', origin);
     res.header("Access-Control-Allow-Headers", "X-Requested-With");
     res.header('Access-Control-Allow-Headers', 'Content-Type');
     next();
});`

3
2017-09-15 08:08





Nó không thể là trường hợp cho hầu hết mọi người duyệt câu hỏi này nhưng tôi đã có vấn đề này chính xác cùng và giải pháp không liên quan đến CORS.

Hóa ra bí mật mã thông báo JSON Web string không được xác định trong các biến môi trường, vì vậy mã thông báo không thể được ký. Điều này gây ra cho bất kỳ POST yêu cầu dựa trên việc kiểm tra hoặc ký mã thông báo để có thời gian chờ và trả lại 503 lỗi, nói với trình duyệt rằng có điều gì đó sai trong CORSmà không phải. Thêm biến môi trường trong Heroku giải quyết vấn đề.

Tôi hi vọng điêu nay se giup được ai đo.


0
2017-07-18 00:05



Vâng, đó là vấn đề với tôi. Bạn có thể cụ thể hơn cách bạn giải quyết vấn đề. Tôi vẫn đang trong quá trình phát triển và đang chạy trên gói Express.js w / node cors. - alan
@alan Tôi đã sử dụng lời hứa để xác minh mã thông báo trong ứng dụng của mình, một số cách nếu bí mật JWT không được xác định, lời hứa sẽ không bao giờ giải quyết, dưới đây là mã Tôi đã sử dụng nếu bạn cần tham khảo thêm. - CatBrownie
Cảm ơn vì đã phản hồi. Tôi sẽ xem xét mã. Bởi bí mật tôi giả sử bạn đang nói về khóa riêng thứ hai. Tôi đang sử dụng oauth2. - alan
Tôi sẽ thêm rằng bất kỳ lời hứa không thành công nào sẽ tạo ra lỗi gây hiểu lầm này! Tôi đã phải rõ ràng về một phiên bản Node đang được sử dụng hoặc khác gọi cơ sở dữ liệu của tôi (mongo) chỉ đơn giản là treo và điều duy nhất trình duyệt có thể cho tôi biết là 503 và sau đó một số silliness Cors liên quan. Lỗi này thực sự làm tôi bối rối lâu nhất app.use(cors()); đang đi. - alphanumeric0101