如何处理Ember.js中的“无路由匹配”并显示404页面?

我如何处理错误

Uncaught Error: No route matched the URL '...' 

并显示一个自定义的404页面?


注意:这个问题在几个月前被问过,并且已经回答了,但是现在不行了。

 App.Router.map(function() { //set up all of your known routes, and then... this.route("fourOhFour", { path: "*path"}); }); 

..你有你的FourOhFourRoute定义显示“找不到路由”的消息。 您将能够访问四个O四path中最初请求的path作为path参数。

编辑:只是为了清晰 – 这个答案是在别人被报告不工作了。

编辑2:我已经更新了答案,以反映Yehuda Katz的评论(如果我错了,请LMK)。

这里是一个例子:

我使用通配符路由在我的路由器中定义最后一个路由请参阅: http : //emberjs.com/guides/routing/defining-your-routes/#toc_wildcard-globbing-routes

我有一个/not-found路由,请参阅我的路由器/*path定义的最后一个路由来捕获任何文本string,请参阅: https : //github.com/pixelhandler/blog/blob/master/client/app/router.js #L19

 Router.map(function () { this.route('about'); this.resource('posts', function () { this.resource('post', { path: ':post_slug' }); }); this.resource('admin', function () { this.route('create'); this.route('edit', { path: ':edit_id' }); }); this.route('not-found', { path: '/*path' }); }); 

该路由redirect到/not-found ,请参阅: https : //github.com/pixelhandler/blog/blob/master/client/app/routes/not-found.js

 import Ember from 'ember'; export default Ember.Route.extend({ redirect: function () { var url = this.router.location.formatURL('/not-found'); if (window.location.pathname !== url) { this.transitionTo('/not-found'); } } }); 

也有任何路线有一个钩子(例如modelbeforeModelafterModel )导致被拒绝的承诺,可以使用error操作转换到404。

 actions: { error: function (error) { Ember.Logger.error(error); this.transitionTo('/not-found'); } } 

其中呈现一个not-found模板,请参阅: https : //github.com/pixelhandler/blog/blob/master/client/app/templates/not-found.hbs

 <h1>404 Not Found</h1> <p> Perhaps you have a link that has changed, see {{#link-to 'posts'}}Archives{{/link-to}}. </p> 

这是我的404页面: http : //pixelhandler.com/not-found

你可以尝试在你的路由器的末端添加一条全线路由:

 App.Router.map(function() { this.resource('post', ...); this.resource('user', ...); this.route('catchAll', { path: '/*' }); }); App.CatchAllRoute = ... 

在Ember 2.x中

App.Router.map函数内部,将代码放置在callback函数的最后面。

 this.route('your_handler_route_name', { path: '/*path' }); 

现在每条路由都不会被先前定义的路由捕获,这将被your_handler_route_name路由your_handler_route_name

解决scheme1

要显示404内容:

 App.Router.reopen({ handleURL: function (url) { try { return this._super(url); } catch (error) { if (error.message.match(/No route matched the URL/)) { return this._super('/404'); } } } }); 

如果你想将URL更改为404,

 App.Router.reopen({ location: locationImplementation, handleURL: function (url) { try { return this._super(url); } catch (error) { if (error.message.match(/No route matched the URL/)) { this.transitionTo('404'); return this._super('/404'); } } } }); 

要了解这里发生了什么,请参阅ember rc2中的22636行。

解决scheme2

parsing当前URL并检查路由或资源是否存在使用App.Router.router.recognizer.hasRoute('route.path.goes.here');