使用Express.js和Backbone.js设置默认路由

时间:2012-02-06 20:16:13

标签: backbone.js express

我正在使用Express和Backbone.js构建一个站点。我想在前端尽可能多地处理。

我很困惑的一件事是如何将路由请求推迟到Backbone而不是Express。我知道Backbone现在可以处理诸如'/ this / here'之类的路由,但当然Express首先解释它。

将这一切交给Backbone的最佳方式是什么?我应该在Express中创建一个处理我没有具体定义的所有内容的全局路由吗?

3 个答案:

答案 0 :(得分:8)

不确定为什么第一个答案被接受,但这是不正确的。有两种方法可以解决这个问题。

  1. 用户抓住所有节点快速路线

    app.get "*", (req, res) ->
      res.render "index"
    
  2. 在节点快速路由中使用catch all

    app.use (req, res) ->
      res.render "index"
    
  3. 其中任何一个都应位于所有路由的末尾,以便仍然可以调用任何其他页面或API端点的get。然后,您的客户端MVC路由器将转到正确的页面。

答案 1 :(得分:0)

技巧是你的应用程序需要知道在客户端(例如使用Backbone)和服务器端(例如使用node.js / Express.js)拦截哪些路由。这是通过在URL中使用哈希('#')来完成的,这些哈希应该被Backbone捕获。不包含散列的URL将被发送到服务器。

以下是如何将路由添加到Backbone路由器对象的示例。我还添加了一个默认路由('* path'),允许Backbone捕获客户端的任何其他路径。请注意,此默认设置仅适用于包含哈希('#')的网址:

// Configure router.
var AppRouter = Backbone.Router.extend({
  routes: {
    'contact/add': 'addContact',
    '*path': 'defaultPage'
  },
  addContact: function() {
    $content.html('Add');
  },
  defaultPage: function(path) {
    $content.html('Default');
  },
});

// Initialize router.
var appRouter = new AppRouter();
Backbone.history.start(); 

相应的html链接将写为:

<a href='/#contact/add'>Add</a> 

答案 2 :(得分:-1)

我可能完全错了,但express是服务器端框架,而骨干是客户端框架 只有服务器端框架负责分析传入请求和传递资源的意义上的路由。

我认为,你所指的是资源路由(来自ruby on rails world)支持inside express,也就是说,你的应用程序中的每个资源都可以在一个安静的网址上获得/posts

你可以比GET,POST,PUT,DELETE这个资源更好,框架会将这些类型调度到正确的业务逻辑。

backbone.js中的路由(根据我的理解)纯客户端路由,使您能够在构建完整的ajax应用程序时拥有可用的浏览器历史记录。

我希望它清楚地表明这两件事虽然名字相同但并不完全相同。