2012-06-09 14 views
7

Sto lavorando alla riscrittura di un sito Web esistente utilizzando Node.js con Express.Configurare percorsi REST in Express JS per Ajax da utilizzare solo con Backbone

Il front-end del sito utilizza Backbone JS e pertanto è necessario che tutti i percorsi necessari siano conformi alla sincronizzazione Backbone nativa. Ora la maggior parte degli URL è il client e la sincronizzazione Backbone sarà la stessa. Ma non funzioneranno per regolare GET in quanto avrebbero bisogno di restituire JSON.

Così sto pensando, sarebbe una buona idea di aggiungere l'estensione al modello URL/Collection in Backbone, come .json, e in veloce per avere questo per ogni percorso:

app.get('/p/:topCategory/:category/:product.:format', function(req, res) { ... }); 

Dove if (req.params.id == 'json') di inviamo JSON, altrimenti rendiamo HTML?

O c'è un approccio migliore? Per favore aiuto.

risposta

12

Il modo migliore per farlo sarebbe quello di utilizzare la funzione di negoziazione del contenuto in veloce 3.x, vale a dire res.format:

https://github.com/visionmedia/express/blob/master/lib/response.js#L299-378

res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

    html: function(){ 
    res.send('<p>hey</p>'); 
    }, 

    json: function(){ 
    res.send({ message: 'hey' }); 
    } 
}); 

approccio Si è anche OK, Yammer per es. sta usando lo stesso approccio: http://developer.yammer.com/api/#message-viewing

+0

Grazie per la risposta. Non ho trovato res.format() nei documenti Express però. Ma ho trovato req.is ('html') o req.is ('json'). Suppongo che uno dovrebbe funzionare ma res.format() sembra migliore in quanto funzione e non ho bisogno di usarlo se/else se per res.is(). –

+0

Non è ancora nella documentazione perché Express 3.x è nuovo e il sito deve essere aggiornato (che succederà molto presto per quanto ne so). – alessioalex

+0

voilà: http://expressjs.com/api.html#res.format – UpTheCreek

6

Utilizzare le intestazioni Accept nelle richieste: Accept: application/json se si desidera ricevere JSON, Accept: text/HTML se si desidera l'HTML.

+0

E come posso impostarlo sul lato Node? –

+0

Si utilizzano tecniche di analisi del testo JavaScript standard (espressioni regolari, ecc.) Per cercare in 'req.headers' qualsiasi cosa inizi con' Accept: '. Il modo in cui lo farei sarebbe quello di inviare una risposta JSON se qualcuno di loro sta chiedendo di JSON, e una risposta HTML se nessuno di essi lo è. – ebohlman

2

Un'alternativa che controlla anche che l'intestazione "X-Requested-With" sia impostata per jQuery et al.

var onlyAllowJsonRequests = function (req, res, next) { 

    var acceptJson = (req.accepted.length && _.any(req.accepted, function (acc) { return acc.value.indexOf("json") !== -1 })); 

    // also check that "X-Requested-With": "XMLHttpRequest" header is set 
    if (acceptJson && (req.xhr === true)) { 
     next(); 
    } else { 
     res.send(406, "Not Acceptable"); 
    } 
}; 

app.use(onlyAllowJsonRequests); 

NB Il carattere di sottolineatura è una depency.

2

Penso che il modo corretto per fare ciò sia implementare la negoziazione di contenuto nell'applicazione. Sì, Express 3.x è un modo per farlo e fornisce una risposta diretta alla tua domanda, ma non penso che sia il modo migliore per farlo perché pone la responsabilità della negoziazione del contenuto nella logica di routing. Non penso che sia un buon posto perché non segue il principio single responsibility, avendo messo la negoziazione di contenuti nella logica di routing.

Ho preso una pugnalata all'attuazione della contrattazione dei contenuti nel mio blog engine; rivedere questo potrebbe aiutarti a guidarti in una buona direzione. L'essenza è che il codice determina l'estensione del file tramite la negoziazione di negoziazione. Quindi, con l'estensione del file, vuole trovare il file di visualizzazione corrispondente, lo rende in una risposta e lo invia al client. L'idea è che risponda con la risorsa richiesta nella rappresentazione richiesta per la negoziazione del contenuto. Il routing logic specifica solo una vista, ma non ha idea della negoziazione del contenuto. Ciò accade al di fuori della logica di routing che rende il design più flessibile.

Il risultato di questo progetto è la possibilità di chiedere una rappresentazione specifica della risorsa come:

http://blog.joeyguerra.com/index.json e ottenere una rappresentazione JSON http://blog.joeyguerra.com/index.phtml e ottenere parziale (o un frammento di HTML) HTML rappresentazione http://blog.joeyguerra.com/index.xml e ottenere una rappresentazione XML.

Problemi correlati