Как я могу обработать ошибку
Uncaught Error: No route matched the URL '...'
и показать пользовательскую страницу 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, чтобы показать сообщение "no route found" по вашему выбору. Вы сможете получить доступ к первоначально запрошенному пути в маршруте fourOhFour в качестве параметра пути.
EDIT: просто для ясности - этот ответ пришел после того, как другие сообщили, что больше не работают.
EDIT 2: я обновил ответ, чтобы отразить комментарий Yehuda Katz (если я ошибаюсь, пожалуйста, LMK).
Вот пример:
Я определяю последний маршрут в моем маршрутизаторе с помощью шаблона подстановочных знаков: http://emberjs.com/guides/routing/defining-your-routes/#toc_wildcard-globbing-routes
У меня есть маршрут /not-found
, см. последний маршрут, определенный в моем маршрутизаторе /*path
, чтобы поймать любую текстовую строку, см. 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' });
});
Этот маршрут перенаправляет на /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');
}
}
});
Также любой маршрут, имеющий крючок (например, model
, beforeModel
, afterModel
), который дает отклоненное обещание, может использовать действие 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
введите код ниже конца функции обратного вызова.
this.route('your_handler_route_name', { path: '/*path' });
Теперь для каждого маршрута НЕ catche по предыдущим определенным маршрутам будет привязан маршрут your_handler_route_name
.
Решение 1
Чтобы отобразить содержимое 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');
}
}
}
});
Чтобы понять, что здесь произошло, см. строку 22636
в ember rc2.
Решение 2
Анализ текущего URL-адреса и проверка наличия пути или ресурса с помощью App.Router.router.recognizer.hasRoute('route.path.goes.here');