2012-06-09 37 views
7

我正在使用Express來使用Node.js重寫現有網站。在Express JS for Ajax中設置REST路由只能與Backbone一起使用

該網站的前端將使用骨幹JS,因此我需要有所有必要的路線符合本地骨幹同步。現在,大多數URL的客戶端和Backbone同步都是相同的。但是他們不會爲常規GET工​​作,因爲他們需要返回JSON。

所以我想,那會是添加擴展模型在骨幹/收藏的網址,如.json一個好主意,並在快遞有這個爲每路線:

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

if (req.params.id == 'json')比我們發送JSON,否則我們呈現HTML?

還是有更好的方法?請幫忙。

回答

12

這樣做是使用內容協商功能在快速3.x中,即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' }); 
    } 
}); 

你的做法也行,Yammer的爲前。正在使用相同的方法:http://developer.yammer.com/api/#message-viewing

+0

感謝您的回覆。儘管我在Express文檔中找不到res.format()。但我發現req.is('html')或req.is('json')。我想任何人都應該工作,但res.format()看起來更好,因爲它的功能,我不需要使用if/else如果res.is()。 –

+0

它還沒有在文檔中,因爲Express 3.x是新的,並且網站需要更新(據我所知,這將很快發生)。 – alessioalex

+0

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

6

在您的請求中使用Accept標題:Accept: application/json如果您想要接收JSON,請使用Accept: text/HTML如果您需要HTML。

+0

我該如何在Node端進行設置? –

+0

您可以使用標準的JavaScript文本解析技術(正則表達式等)查看'req.headers'以查看任何以'Accept:'開頭的內容。我會這樣做的方式是發送一個JSON響應,如果他們中的任何一個請求JSON,並且是一個HTML響應,如果它們都不是。 – ebohlman

2

另一種方法是檢查「X-Requested-With」頭是否設置爲jQuery等。

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下劃線是依賴關係。

2

我認爲正確的做法是將內容協商放入您的應用程序中。是的,Express 3.x工具是一種方法,可以直接回答您的問題,但我認爲這不是最好的方式,因爲它將內容談判責任置於路由邏輯中。我認爲這不是一個好的地方,因爲它不遵循single responsibility原則,將內容協商爲的路由邏輯。

我在刺探內容談判在我的blog engine;審查這可能有助於指導你在一個好的方向。要點是代碼通過內容協商邏輯確定文件擴展名。然後,使用文件擴展名,它希望找到相應的視圖文件,將其呈現爲響應並將其發送回客戶端。這個想法是,它根據內容協商請求的表示響應請求的資源。 routing logic只指定一個視圖,但不知道內容協商。這發生在路由邏輯之外,這使得設計更加靈活。

這種設計的結果是,要求像資源的特定表示的能力:

http://blog.joeyguerra.com/index.json,並得到一個JSON表示 http://blog.joeyguerra.com/index.phtml並獲得局部(或HTML片段)HTML表示 http://blog.joeyguerra.com/index.xml並獲得一個XML表示。

相關問題