在Express JS for Ajax中设置REST路由只能与Backbone一起使用

我正在使用Express来使用Node.js重写现有的网站。

该网站的前端将使用骨干JS,因此我需要有所有必要的路线符合本地骨干同步。 现在,大多数URL的客户端和Backbone同步都是一样的。 但是它们不能用于常规GET,因为它们需要返回JSON。

所以我想,在Backbone中添加对模型/集合URL的扩展(比如.json和Express)是否是一个好主意,

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

if (req.params.id == 'json')比我们发送JSON,否则我们渲染HTML?

还是有更好的方法? 请帮忙。

更好的方法是使用Express 3.x中的内容协商function,即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

在请求中使用Accept标头:如果您想接收JSON,请Accept: application/json如果您需要Accept: text/HTML ,则Accept: text/HTML HTML。

另一种方法是检查“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下划线是一个依赖。

我认为正确的做法是在你的应用程序中实现内容协商 。 是的,快速3.x设施是一种方法来做到这一点,并提供了一个直接的答案你的问题,但我不认为这是做这件事的最好方法,因为它把内容谈判的责任放在路由逻辑。 我认为这不是一个好地方,因为它不遵循单一责任原则,把内容协商放在路由逻辑中。

我在我的博客引擎中实施了内容谈判 。 审查可能有助于指导你在一个好的方向。 要点是代码通过内容协商逻辑确定文件扩展名。 然后,使用文件扩展名,它想要find相应的视图文件,将其呈现为响应并将其发送回客户端。 这个想法是,它根据内容协商请求的表示响应请求的资源。 路由逻辑只指定一个视图,但不知道内容协商。 这发生在路由逻辑之外,这使得devise更加灵活。

这个devise的结果是能够请求资源的具体表示,如:

http://blog.joeyguerra.com/index.json并获得JSON表示http://blog.joeyguerra.com/index.phtml并获得部分(或HTML片段)HTML表示formshttp&#xFF1A://blog.joeyguerra&#x3002; com / index.xml并获得一个XML表示。