Почему междоменный запрос работает в Chrome, но не работает в Firefox при запросе с сервера Node (Express)?

Некоторая информация о настройке: мы используем jQuery для AJAX (и другие вещи, но AJAX относится к этому вопросу), Node w / Express для сервера и Chrome 17 / Firefox 10 для тестирования (нам не нужна совместимость с IE ).

Проблема, с которой мы сталкиваемся, - это невозможность получить ответ при выполнении междоменного запроса к серверу Node. В целях разработки (а также потому, что на данный момент мы должны запускать Apache в дополнение к этому серверу), мы запускаем сервер узла на порту 3001 (localhost: 3001), который даже на localhost считается браузером перекрестным доменом (на по крайней мере, по моему опыту, пытаясь заставить два сервера на localhost разговаривать друг с другом).

У меня установлен app.enable("jsonp callback") на сервере, который прекрасно работает для наших GET маршрутов, однако, похоже, он не так хорошо работает для наших POST маршрутов (сейчас это все в нашей компании, но лучшие альтернативы приветствуются в качестве предложений).

Рассматриваемый маршрут определяется следующим образом:

app.post("/create", function(req, res) {
  // Added the next 3 lines as a test and it seemed to add success, 
  // not happy with it though
  var ref = req.header("Referer");
  res.header("Access-Control-Allow-Origin", ref);
  res.header("Access-Control-Allow-Methods", "POST");
  console.log(req.body); // echo request body
  res.json({success: true}); // return a notification of success
});

Запрос AJAX выглядит так:

// The URL is either the IP of the server or Localhost
$.ajax({
  url: "http://localhost:3001/create",
  data: { 
    name: "john" 
  },
  crossDomain: true,
  type: "POST", 
  dataType: "json",
  success: function(r) {
    console.log(r);
  },
  error = function() {
    alert("Failed");
  }
};

Некоторая второстепенная информация: когда мы используем вышеуказанное в Firefox с dataType: "jsonp", он просто терпит неудачу с 404, но фактически отправляет запрос только с "json". Еще одна информация: без crossDomain: true запрос вообще не работает. Запросы Firefox, сделанные с помощью вышеупомянутого, фактически проходят на сервер, однако он выдает ошибку до получения ответа.

Запрос работает нормально и успешно выполняется в Chrome, но не работает в Firefox. Согласно консоли ответ возвращает статус «200 OK», но он по-прежнему запускает функцию ошибки jQuery.ajax с statusCode 0 и statusText Error (что очень полезно ...) и несмотря на то, что мы пробовали мы не добились каких-либо успехов в выполнении этой работы.

Мы очень ценим любую помощь или указания, куда обратиться для решения этой проблемы.

ОБНОВЛЕНИЕ

Просто ради обновления. Эта проблема перестала возникать, возможно, это была какая-то основная ошибка в нашем коде, которую мы исправили в процессе рефакторинга, не осознавая этого, или это была ошибка в Firefox, которая была исправлена. В любом случае мы больше не сталкиваемся с этой проблемой.


person Brandon Buck    schedule 29.02.2012    source источник


Ответы (1)


Предположим, вы хотите выполнять обратные вызовы в стиле JSONP, вам понадобятся две вещи: app.enable("jsonp callback") (не app.enable("json callback")). Кроме того, вам необходимо указать jQuery выполнить вызов JSONP, указав callback=? в URL-адресе.

person Linus Thiel    schedule 29.02.2012
comment
Да, вы правы, это jsonp callback, я это неправильно скопировал (но сейчас поправил). Кроме того, если я скажу jQuery выполнять прямые "jsonp" запросы, он вообще не работает - фактически он полностью игнорирует POST и отправляет только запросы GET. Однако с crossDomain: true и с dataType: "json" запрос работает. В любом случае это не мой настоящий вопрос, вопрос в том, почему он работает в Chrome, но не в Firefox? - person Brandon Buck; 29.02.2012
comment
Просто ради попытки я попытался реализовать ваше предлагаемое решение, но оно начало лаять с 404 not found - в отличие от моего вышеупомянутого использования, когда ответ проходит и возвращает 200 OK, но все еще не работает в Firefox (не Chrome). - person Brandon Buck; 29.02.2012