2012-06-09 7 views
7

Pracuję nad ponownym zapisaniem istniejącej strony internetowej za pomocą Node.js z Expressem.Konfigurowanie tras REST w Express JS dla Ajax tylko do użycia z Backbone

Przednia strona witryny będzie korzystała z usługi Backbone JS, a zatem muszę mieć wszystkie niezbędne trasy zgodne z natywną synchronizacją kręgosłupa. Teraz większość adresu URL klienta i synchronizacji Tarcza będzie taka sama. Ale nie będą działać dla regularnego GET, ponieważ będą musiały zwrócić JSON.

Więc myślę, że będzie to dobry pomysł, aby dodać rozszerzenie do modelu URL/kolekcję w kręgosłup, takie jak .json, aw Express mieć to dla każdej trasy:

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

Gdzie if (req.params.id == 'json') niż wysyłamy JSON, w przeciwnym razie renderujemy HTML?

Czy istnieje lepsze podejście? Proszę pomóż.

Odpowiedz

12

Lepszym sposobem osiągnięcia tego celu byłoby użyć funkcji negocjacji zawartości in Express 3.x, mianowicie 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' }); 
    } 
}); 

podejście Ty też ok, Skamlać dla ex. używa tego samego podejścia: http://developer.yammer.com/api/#message-viewing

+0

Dzięki za odpowiedź. Nie znalazłem jednak res.format() w Express docs. Ale znalazłem req.is ('html') lub req.is ('json'). Zgaduję, że albo powinien działać, ale res.format() wygląda lepiej, ponieważ jest to funkcja i nie potrzebuję używać, jeśli/else jeśli dla res.is(). –

+0

Nie jest to jeszcze w dokumentacji, ponieważ Express 3.x jest nowy i strona wymaga aktualizacji (stanie się to wkrótce, o ile wiem). – alessioalex

+0

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

6

Użyj nagłówków w żądaniach: Accept: application/json, jeśli chcesz otrzymywać JSON, Accept: text/HTML, jeśli chcesz HTML.

+0

A jak ustawić to po stronie węzła? –

+0

Używasz standardowych technik tekstowania w języku JavaScript (wyrażeń regularnych itp.), Aby przejrzeć 'req.headers' dla czegoś zaczynającego się od' Accept: '. Sposób, w jaki bym to zrobił, to wysłanie odpowiedzi JSON, jeśli któryś z nich prosi o JSON, i odpowiedź HTML, jeśli żadna z nich nie jest. – ebohlman

2

Alternatywa, która sprawdza również, czy ustawiony jest nagłówek "X-Requested-With" dla 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); 

Podkreślenie NB to deputacja.

2

Myślę, że właściwym sposobem na to jest wdrożenie negocjacji treści do swojej aplikacji. Tak, narzędzie Express 3.x to sposób na zrobienie tego i zapewnia bezpośrednią odpowiedź na twoje pytanie, ale nie sądzę, że jest to najlepszy sposób, ponieważ umieszcza odpowiedzialność za negocjowanie treści w logice routingu. Nie wydaje mi się, żeby to było dobre miejsce, ponieważ nie jest zgodne z zasadą single responsibility po ustawieniu w logice rutowania negocjacji zawartości .

Podjąłem decyzję o wdrożeniu negocjacji treści w moim blog engine; sprawdzenie, które może Ci pomóc w dobrym kierunku. Istotą jest to, że kod określa rozszerzenie pliku za pomocą logiki negocjacji. Następnie, z rozszerzeniem pliku, chce znaleźć odpowiedni plik widoku, renderuje go w odpowiedzi i odsyła z powrotem do klienta. Chodzi o to, że odpowiada żądanym zasobem w żądanej reprezentacji na negocjację treści. Parametr routing logic określa tylko widok, ale nie ma pojęcia o negocjowaniu treści. Dzieje się tak poza logiką routingu, która zapewnia bardziej elastyczny projekt.

Rezultatem tego projektu jest możliwość poprosić o konkretnej reprezentacji zasobu jak:

http://blog.joeyguerra.com/index.json i dostać reprezentacji JSON http://blog.joeyguerra.com/index.phtml i uzyskać częściowe (lub HTML fragment) HTML reprezentacja http://blog.joeyguerra.com/index.xml i uzyskać reprezentacja XML.

Powiązane problemy