2015-01-12 21 views
10

Ho il follow codice Backbone.jsImpossibile recuperare JSON In collezione Backbone

var List = Backbone.Collection.extend({ 
    model: Item, 
    url: '/api/items', 
}); 

e poi a mio avviso che sto cercando di fare quanto segue per andare a prendere il JSON dalle API e popolare i modelli

this.collection = new List(); 

var that = this; 
this.collection.fetch({ 
    success: function() { 
     that.render(); 
     console.log('Fetch successful!'); 
    }, 
    error: function() { 
     console.log('Failed to fetch!'); 
    } 
}); 

Tuttavia il recupero non funziona e il suo triggering "Impossibile recuperare!" Messaggio. Qualcuno può vedere qualcosa che sto sbagliando? Se vado allo api/items nel mio browser, mi viene richiesto di scaricare il file JSON, quindi è definitivamente lì e quando apro la sua nuova riga delimitata. Di seguito è riportato un frammento di codice api che rimanda il JSON

res.writeHead(200, { 
    'Content-Type': 'application/x-json-stream' 
}); 

setTimeout(function() { 
    var i; 
    for (i=0; i<limit; i+=1) { 
     res.write(JSON.stringify(createRandomItem(i+skip, sort)) + '\n'); 
    } 
    res.end(); 
}, 100 + Math.floor(Math.random() * 3000)); 

Anche quando uso strumenti di sviluppo per verificare la richiesta che è stata inviata all'API la risposta al mio ritorno sembra solo essere caratteri casuali e ottengo l'errore "SyntaxError: JSON.parse: carattere imprevisto"

eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2 
+0

Prova solo 'res.send (200, {il tuo array/oggetti/etc})' – benhowdle89

+0

Non sono sicuro, ma può essere tale che il tipo di contenuto JSON in streaming non sia supportato dall'implementazione JS del tuo browser? AFAIK, Backbone utilizza un semplice oggetto 'XMLHttpRequest' per gestire le richieste di raccolta. Cosa succede se usi un semplice 'application/json'? – VisioN

+0

Ho provato a cambiare il tipo di contenuto in 'application/json', ma ho ottenuto lo stesso risultato.Inoltre, vorrei sottolineare che, se possibile, non voglio modificare il codice lato server. – Bender

risposta

9

il ciclo di scrittura risposta generare stringa JSON non valida, perché appena concatenare oggetti JSON.

È possibile raccogliere tutti gli oggetti in ordine e stringa i così:

setTimeout(function() { 
    var i, data = []; 
    for (i=0; i<limit; i+=1) { 
     data.push(createRandomItem(i+skip, sort)); 
    } 

    res.write(JSON.stringify(data)); 
    res.end(); 
}, 100 + Math.floor(Math.random() * 3000)); 
+0

Grazie funziona anche se ho cambiato il tipo di contenuto in 'application/json' ma c'è comunque la possibilità di farlo funzionare senza modificare il codice di back-end? – Bender

+1

Vuoi che il 'JSON.parse nativo 'sia in grado di analizzare JSON non valido? Credo che non sia possibile. –

+1

@Bender, è necessario personalizzare 'Backbone.sync' per leggere la risposta del server come testo normale, la risposta divisa da qualche delimitatore (\ n nel tuo caso),' JSON.parse' uno per uno e poi raccoglierli lato client. Penso che sia molto meglio produrre solo JSON valido sul lato server. – ertrzyiks

4

In genere, quando si ottiene un JSON.parse: carattere inaspettato errore, indica che gli attributi JSON non sono doppio quote-qualificato, in modo sostanzialmente il JSON potrebbe assomigliare a questo:

"{ test: 1, testing: 2 }"   *Invalid* 

O anche questo:

"{ 'test': 1, 'testing': 2 }"  *Invalid* 

Invece di simile a questo:

'{ "test": 1, "testing": 2 }'  *Valid* 

O questo:

"{ \"test\": 1, \"testing\": 2 }" *Valid* 
3

Prima cosa prima. Hai sicuramente problemi di configurazione del server. Sembra che il tuo mime type non sia impostato e tu abbia (possibilmente gzip) la compressione abilitata.

Utilizzare Google Chrome per accedere all'URL che serve il JSON. Il browser dovrebbe visualizzare il JSON in testo normale senza che venga richiesto di scaricarlo.

Quindi ottenere l'estensione JSONView per Chrome. Sfoglia l'URL che serve il JSON. Dovresti vedere il JSON in formato "carino" con parentesi graffe corrispondenti.

Dopo averlo, torna alla tua app Web e prova. Se hai ancora problemi, pubblica le informazioni sul tuo server web (tipo e versione) e altre informazioni speciali. Andremo da lì.

Problemi correlati