Защо заявката за кръстосани домейни работи в 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