2013-04-16 5 views
6

Ich habe in meiner Chrome-Konsole mit Backbone gespielt und bin auf ein domänenübergreifendes Problem gestoßen, das ich nicht herausfinden kann.Backbone.js wird keine Cross-Host-Anfragen stellen?

Gastgeber Ich verbinde vermutlich korrekt implementiert CORS weil eine rohe XHR Anfrage die erwartete JSON zurückgibt:

var http = new XMLHttpRequest(); 
http.open('GET', 'http://example.com:3000/entities/item/15.json', true); 
http.onreadystatechange = function(evt) { console.log(evt); } 
http.send(); 

(Protokolle 3 XHR Fortschritt Ereignisse auf der Konsole mit den richtigen Daten in der Antwort)

Aber wenn ich folgend mit Backbone tun hat der Browser es nicht mag:

var Item = Backbone.Model.extend({}); 
var ItemsCollection = Backbone.Collection.extend({ 
    model: Item, 
    url: 'http://example.com:3000/entities/item/' 
}); 
var items = new ItemsCollection(); 
items.fetch(); 

(kehrt XMLHttpRequest cannot load http://example.com:3000/entities/item/. Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin.)

Gibt es irgendetwas, was ich tun muss, um Backbone zu sagen, dass es mit CORS arbeiten soll? Dieser Fehler scheint aufgetreten zu sein, bevor der Browser überhaupt eine Anfrage gestellt hat, also glaube ich nicht, dass es sich um einen Serverkonfigurationsfehler handelt.

+0

Sie können in Chrome gleichen Ursprungs Richtlinie deaktivieren, [hier] (http: // Stackoverflow. com/a/3177718/1344509) erläutert, wie Sie es in Chrome deaktivieren. – Ikrom

+0

Danke für den Tipp, aber ich möchte ihn nicht deaktivieren (dies ist so konzipiert, dass er auf normalen Webbrowsern läuft). – magneticMonster

+0

Dann hilft vielleicht [dies] (http://stackoverflow.com/a/6487765/1344509). – Ikrom

Antwort

8

Ich hoffe, dass einer von ihnen hilft (ich noch nicht versucht):
1. Overriding Backbone.js sync to allow Cross Origin

(function() { 
    var proxiedSync = Backbone.sync; 
    Backbone.sync = function(method, model, options) { 
    options || (options = {}); 
    if (!options.crossDomain) { 
     options.crossDomain = true; 
    } 
    if (!options.xhrFields) { 
     options.xhrFields = {withCredentials:true}; 
    } 
    return proxiedSync(method, model, options); 
    }; 
})(); 

2. Cross domain CORS support for backbone.js

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    options.crossDomain ={ 
     crossDomain: true 
    }; 
    options.xhrFields = { 
     withCredentials: true 
    }; 
}); 
+1

'xhrFields.withCredentials' stürzt in Firefox ab, wenn Sie einen synchronen AJAX-Aufruf durchführen, zum Beispiel das Laden einer Vorlage vor dem Rendern. Glücklicherweise befinden sich meine Vorlagen auf der gleichen Domain, so dass ich das obige einfach in 'if (originalOptions.async! == false) umwandeln konnte.' Block – kasztelan

+0

Wo sollte ich das Synchronisierungsmethoden-Update hinzufügen? In backbone.js ODER mein Skript? – dang

+0

@dang In Ihrem Javascript-Code, nicht Backbonejs – Ikrom

0

Es stellt sich die URLs heraus, dass ich mit anforderte Das Backbone war etwas anders als das, das über das XHR angefordert wurde (ihnen fehlte ein Queryarg). Dies verursachte den Server 500, der die CORS-Header nicht aufweist. Chrome hat die HTTP-Anfrage im Netzwerk-Tab des Debug-Panels überhaupt nicht angezeigt, daher war ich sehr verwirrt.

Das Reparieren der 500 auf dem Server hat dies wieder funktioniert.

5

hey können Sie so etwas wie verwenden:

var PostsCollection = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    //this.id = options.id; 
    }, 
    url: 'http://myapi/api/get_posts/?count=8', 
}); 

posts = new PostsCollection(); 
posts.fetch({ 
    dataType: 'jsonp', 
    success : function (data) { 
    console.log(data); 
    } 
}); 

der Schlüssel wir verwenden 'JSONP' ist, müssen

+0

Arbeitete einwandfrei! – pastullo

+0

Danke, mein Herr! 'Jsonp' löste mein Problem –

+0

Danke @heridev ..Löst mein Problem .. – Manivannan