2012-07-02 3 views
16

У меня есть объект Backbone Collection со следующим URL-адресом «http: // localhost: 8080/api/menu/1/featured». Я пытаюсь выполнить операцию выборки для извлечения коллекции из url и ее анализа. Однако на стороне сервера тип метода, который я вижу для этого запроса, является OPTIONS. Сервер допускает только поддержку метода GET. Я не уверен, как Backbone выясняет, какой тип метода использовать, и почему он иногда меняет тип метода OPTIONS. Я использую сервер Node.js для обработки запроса. Этот код ниже - это то, что я сделал.Запрос на выбор базовой линии - метод 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(); 

Пожалуйста, помогите, спасибо!

ответ

19

Прошло некоторое время, но я помню, как это дошло до этого. Это может быть две вещи: Магистраль по умолчанию пыталась выполнить вызовы API RESTful на ваш сервер, это означает GET, POST, PUT и DELETE.

Многие серверы не были созданы с реальной поддержкой REST и поддерживают только GET и POST. Когда Backbone отправляет команду PUT или DELETE, ваш браузер (не Backbone) автоматически отправляет запрос OPTIONS сначала, чтобы узнать, разрешено ли разрешать подобные запросы. Если ваш сервер отвечает неправильно, этот вызов завершится неудачно, и, возможно, Backbone ничего не сделает.

Чтобы обойти этот набор Backbone.emulateHTTP = true; Или ваш сервер правильно ответит на вызовы OPTIONS. Дополнительную информацию см. В документации: http://backbonejs.org/#Sync-emulateHTTP

Другая проблема заключается в том, что вы делаете ajax-запросы для междоменного/поддомена, и вам необходимо правильно включить CORS. Это также включает в себя надлежащий ответ на запросы OPTIONS.

+0

Я не думаю, что этот ответ прав. У меня такая же проблема с методом save() + CORS. Мой сервер может правильно обрабатывать вызовы CORS, я опробовал $ .ajax и внешний тестер интерфейса REST. Теперь я отправляю вызов POST с помощью метода model.save(), метод доступа-контроля-POST, но метод OPTIONS, поэтому мой сервер запутан и отправляет обратно заголовок 404. Я использую PHP SLIM на стороне сервера. – inf3rno

+0

Просто потому, что это не сработало для вас, это не значит, что это не помогло другим людям. Извините, я мало знаю о вашей настройке, это может быть и ряд других вещей. –

+1

С помощью вызовов CORS у вас есть запрос предварительной проверки OPTIONS, и если вы не ответите на заголовки Access-Control-Request- * с заголовками Access-Control-Allow- *, то ваш исходный запрос не удастся. Это была моя проблема, но теперь я читал, что вы написали то же самое, поэтому извините меня за проголосовать! – inf3rno

1

Backbone.js отображает методы CRUD для HTTP. Взято из исходного кода Backbone:

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

Возможно, проблема связана с вашим узлом.

0

Какую версию позвоночника вы используете? У меня была точно такая же проблема, но потом понял, что я использовал старую версию магистрали (0.3.3) в учебнике. Обновлена ​​ссылка на последние backbone.js (0.9.2) и underscore.js (1.3.3) и отправляется как GET.

5

У меня была такая же проблема, как и у OP - использование Backbone и NodeJS для сохранения данных с помощью запроса CORS POST постоянно отправляло заголовок запроса OPTIONS http и вообще не запускал запрос POST.

Очевидно, что CORS с запросами, которые будут «вызывать побочные эффекты для пользовательских данных», заставит ваш браузер «предварять» запрос с заголовком запроса OPTIONS, чтобы проверить утверждение, прежде чем фактически отправить ваш предполагаемый метод HTTP-запроса. https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

Эта нить была то, что решить мою проблему - How to allow CORS?

Плакат использовал некоторые межплатформенное одобрить PUT/GET/POST/DELETE запросов как так -

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

и следующий(); позволит проверять OPTIONS для продолжения запроса POST.

Работал как сон для меня, надеюсь, что это поможет кому-то еще.

+0

Как насчет того, чтобы делать что-то вроде: 'if request.method ==" ОПЦИИ "возвращать 200', чтобы сообщить переднюю часть ** ОПЦИИ ** запрос может быть обработан?Я использую бэкэнд Python и не уверен, есть ли эквивалент ** next() **. – benjaminz