4

我有一个提供以下路线的快递应用程序

/login
/signup
/
/app

我希望我的主干应用程序管理以下路线

/app/overview/:company_id/:date
/app/rooms/:company_id/:date

无论如何,express 在 /app 上提供了基本的 app.jade,然后应该将导航移交给主干,但不是拦截并给我一条找不到的路线。

我该怎么做呢?鉴于有人可能会复制并粘贴一个网址,例如

/app/overview/3/2012-12-12
4

2 回答 2

4

可能有两个相关的问题:您正在使用推送状态客户端(即使用“真实”URL,而不是 /app#overview 等哈希片段)但(可能)没有在 Backbone 中启用推送状态,并且您的快速配置确实不响应那些客户端路由。

使用推送状态 URL,您仍然必须在服务器端处理这些 URL,因为用户可能会使用这些直接的“客户端”URL 访问您的网站(哈希片段不会发生这种情况,因为哈希部分永远不会发送到服务器)。

因此,要修复服务器端处理,express 允许使用正则表达式作为路由,所以不是:

app.get('/app', function(req, res) {
  // Render the app...
});

你可以这样做(见这里):

// The regexp could be a little more restrictive, obviously, but you get the point...
app.get(/^\/app(\/\w+)*$/, function(req, res) {
  // Render the app...
});

因此,无论哪个 /app/* URL 用作您的 Web 应用程序的入口点,它都会获得必要的内容。

然后在您的 Backbone 初始化客户端中,您应该使用Backbone.history.start({pushState: true})启用推送状态来启动历史管理。见这里

于 2012-11-19T01:51:16.907 回答
2

您可以简单地为应用程序提供服务,而保持路线不变。

// given your app serves routes.index
app.get('/app/overview/:company_id/:date', routes.index);
app.get('/app/rooms/:company_id/:date', routes.index);
// ... and so on

这样,应用程序将正常服务,允许骨干网处理路由。

于 2012-11-19T01:30:28.847 回答