2012-07-02 47 views
16

Tôi có đối tượng Collection Backbone với URL sau "http: // localhost: 8080/api/menu/1/featured". Tôi đang cố gắng thực hiện một hoạt động lấy để lấy bộ sưu tập từ url và phân tích nó. Tuy nhiên, ở phía máy chủ, loại phương thức mà tôi thấy cho yêu cầu này là OPTIONS. Máy chủ chỉ giả sử để hỗ trợ phương thức GET. Tôi không chắc làm thế nào Backbone là tìm ra loại phương pháp để sử dụng, và tại sao nó thay đổi để loại phương pháp OPTIONS ngẫu nhiên đôi khi. Tôi đang sử dụng máy chủ Node.js để xử lý yêu cầu. Mã dưới đây là khá nhiều những gì tôi đã làm.Yêu cầu tìm nạp xương sống là phương pháp OPTIONS

var FeaturedCollection = Backbone.Collection.extend({ 
    model:FeaturedContent, 
    url:function() { return url_featured; }, 
    parse:function (response) { 
     console.log(response); 
     return response; 
    } 
}); 

var featuredCollection = new FeaturedCollection(); 
featuredCollection.fetch(); 

Xin vui lòng trợ giúp, cảm ơn!

Trả lời

19

Đã lâu rồi, nhưng tôi nhớ đã bắt gặp điều này trước đây. Có hai điều này có thể là: Xương sống theo mặc định đã cố gắng thực hiện các cuộc gọi API RESTful đến chương trình phụ trợ của bạn, điều này có nghĩa là GET, POST, PUT và DELETE.

Nhiều chương trình phụ trợ không được xây dựng với hỗ trợ REST thực và chỉ hỗ trợ GET và POST. Khi Backbone gửi lệnh PUT hoặc DELETE, trình duyệt của bạn (không phải Backbone) sẽ tự động gửi yêu cầu OPTIONS trước để xem liệu nó có được phép thực hiện các loại yêu cầu này hay không. Nếu máy chủ của bạn trả lời không đúng, cuộc gọi này sẽ không thành công và có lẽ Backbone sẽ không làm bất cứ điều gì.

Để xem xung quanh bộ này Backbone.emulateHTTP = true; Hoặc yêu cầu máy chủ của bạn trả lời đúng các cuộc gọi OPTIONS. Xem tài liệu để biết thêm thông tin: http://backbonejs.org/#Sync-emulateHTTP

Vấn đề khác là bạn đang yêu cầu ajax tên miền chéo/tên miền phụ và bạn cần bật CORS đúng cách. Điều này cũng bao gồm trả lời đúng các yêu cầu OPTIONS.

+0

Tôi không nghĩ câu trả lời này là đúng. Tôi có cùng một vấn đề với phương thức save() + CORS. Máy chủ của tôi có thể xử lý các cuộc gọi CORS đúng cách, tôi đã thử với $ .ajax và một trình kiểm tra giao diện REST bên ngoài. Bây giờ tôi gửi POST với model.save(), Access-Control-Request-Method là POST, nhưng phương thức là OPTIONS, vì vậy máy chủ của tôi bị nhầm lẫn và gửi lại tiêu đề 404 .. Tôi sử dụng PHP SLIM ở phía máy chủ. – inf3rno

+0

Chỉ vì nó không hoạt động cho bạn không có nghĩa là nó không giúp người khác. Xin lỗi, tôi không biết nhiều về thiết lập của bạn có thể là một số thứ khác. –

+1

Bằng cuộc gọi CORS, u có cuộc gọi OPTIONS preflight và nếu bạn không phản hồi tốt với các tiêu đề Access-Control-Request- * với tiêu đề Access-Control-Allow- * thì yêu cầu ban đầu của bạn sẽ không thành công. Đó là vấn đề của tôi, nhưng bây giờ tôi đã đọc rằng bạn đã viết như vậy, vì vậy xin lỗi tôi bỏ phiếu! – inf3rno

1

Backbone.js ánh xạ các phương thức CRUD đến HTTP. Lấy từ mã nguồn của Backbone:

var methodMap = { 
    'create': 'POST', 
    'update': 'PUT', 
    'delete': 'DELETE', 
    'read': 'GET' 
}; 
Backbone.sync = function(method, model, options) { 
    var type = methodMap[method]; 

Có thể sự cố nằm trên phụ trợ node.js của bạn.

0

Bạn đang sử dụng phiên bản xương sống nào? Tôi đã có chính xác cùng một vấn đề, nhưng sau đó nhận ra tôi đã sử dụng một phiên bản cũ của xương sống (0.3.3) trong một hướng dẫn. Đã nâng cấp liên kết lên backbone.js mới nhất (0.9.2) và underscore.js (1.3.3) và nó gửi dưới dạng GET.

5

Tôi gặp vấn đề tương tự như OP - sử dụng Backbone và NodeJS để lưu dữ liệu qua yêu cầu POST của CORS sẽ liên tục gửi tiêu đề yêu cầu OPTIONS http và không kích hoạt yêu cầu POST.

Rõ ràng CORS có yêu cầu sẽ "gây tác dụng phụ trên dữ liệu người dùng" sẽ làm cho trình duyệt của bạn "đặt trước" yêu cầu với tiêu đề yêu cầu OPTIONS để kiểm tra phê duyệt trước khi thực sự gửi phương thức yêu cầu HTTP mong muốn của bạn. https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

chủ đề này là gì giải quyết vấn đề của tôi - How to allow CORS?

Các poster sử dụng một số trung gian để phê duyệt PUT/GET/POST/DELETE yêu cầu như vậy -

res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
... 
next(); 

và tiếp theo(); sẽ cho phép OPTIONS kiểm tra để tiếp tục yêu cầu POST.

Làm việc như một giấc mơ đối với tôi, hy vọng nó cũng giúp người khác.

+0

Làm thế nào để làm một cái gì đó như: 'nếu request.method ==" OPTIONS "trả lại 200' để nói cho kết thúc trước ** OPTIONS ** yêu cầu có thể được xử lý?Tôi đang sử dụng một phụ trợ Python và không chắc chắn nếu có một tương đương với ** next() **. – benjaminz

Các vấn đề liên quan