Ember和Express:让Ember处理路线而不是Express?

时间:2014-07-19 00:19:10

标签: node.js ember.js express

这可能是一个愚蠢的问题,但是我在Express服务器上使用ember-cli提供的Ember应用程序,但是当我尝试访问各种路由时,我的Express应用程序错误,说没有route存在(这是真的,因为我在Ember中定义了路由,而不是Express)。我该如何解决这个问题,这是正常行为吗?

我的Ember路由器:

Router.map(function() {
  this.route('index', {path: '/' });
  this.route('portkey');
  this.route('login');
});

My Express路线只是一个不提供任何Ember路线的API,因为localhost:1234会自动加载index.html

2 个答案:

答案 0 :(得分:4)

我使用Ember路由器而不是Express路由器时遇到了问题。我所做的就是有一条快速路线(用于' /'),它显示我的Ember应用程序index.html(实际上是index.ejs)页面。不是很有希望这是 正确的做法,但它是我如何做到的,它对我有用。

首先从这开始。

app.get('/', function(req, res) {
    res.render('index', {});
});

这是你的快车道。现在你的余烬路由。

App.Router.map( function() {
    this.route("about", { path: "/about" });
    this.route("favorites", { path: "/favorites" });
});

截至目前,您的路由结构如下所示:

yourdomain.com/             --> index.ejs displayed via express routing
              /#/           --> this is the ember index route
              /#/about      --> this is the ember about route
              /#/favorites  --> this is the ember favorites route

在index.ejs文件中,你有一个基本的ember文件链接到你的ember应用程序。

现在解决你的链接问题...

如果使用ember路由器,请确保以正确的方式链接到不同的路由。 (请记住,ember路线以/#/ someroute开头)。

所以你手柄中的链接应该是这样的:

{{#link-to 'some_page'}}Go to some page{{/link}}

不会

<a href="some_page">Go to some page</a>

使用第二个,express将尝试处理路由,但通过使用第一个,ember正在处理路由。

因此,如果您真的想到它,您可以拥有尽可能多的ember应用程序,因为每个ember应用程序都链接到快速路由中的当前页面。

例如,在我的网站上,我使用了两条路线(显然还有一堆REST路线):login.ejsindex.ejs

因此对于my site,我有以下路线:

mysite.com/             
          /#/           
          /#/budget     
          /#/history     
          /#/profile    
          /#/logout     

mysite.com/login#/
                #/register
                #/forget

我希望这对你有所帮助。

修改

/#/是告诉你通过路由器路由的ember的惯例。

这样想:Ember是一个单页面框架。因此,当您在ember中从一个页面链接到另一个页面时,您不会 更改页面。您只是删除dom元素并用新元素替换它们。但是如果你去服务器上的/budget,你现在要进入一个全新的页面,而不仅仅是ember应用程序的/#/budget部分。

我认为你只是混淆了ember路由器的真正含义。

答案 1 :(得分:0)

当我尝试直接访问除了index.html之外的Ember项目的任何部分时,我遇到了类似的问题。从那里我可以轻松地导航到我想要的位置,但这意味着为某人提供链接或刷新页面会失败。

示例:/accounts会失败。 /#/accounts会成功重定向到/accounts,但刷新仍然无效。

解决方案:

Router.map(function() {
  this.route('accounts');
});

Router.reopen({
  location: 'hash'
});

现在我的所有链接都以#为前缀,例如/#/accounts,刷新和直接链接按预期工作。