# Die Seiten 404 und 401 anpassen

> Registriere Handler mit ROUTE('#404') und ROUTE('#401'), um die eingebauten Fehlerseiten zu ersetzen, und löse sie selbst mit $.fallback() aus.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: 876b5296bb9dec5f42ab8be14fdb7dbe06e9ddf55ba9f8b691915e832bf976f7
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Wenn Total.js eine Anfrage nicht bedienen kann, zeigt es eine eingebaute Fehlerseite. Eine Route, deren URL `#` plus der Statuscode ist, ersetzt sie: `ROUTE('#404', fn)` für „nicht gefunden“, `ROUTE('#401', fn)` für „nicht autorisiert“, ebenso für `#400`, `#431` und weitere. Der Handler erhält `$` wie jede Route, aber **den Status setzt du selbst** mit `$.response.status`: Total.js tut das nicht für dich, wenn ein eigener Handler existiert. Ohne eigenen Handler wird die eingebaute Seite verwendet, und AJAX-Anfragen (Header `x-requested-with`) erhalten statt HTML einen JSON-Fehler.

`$.fallback(code)` leitet die aktuelle Anfrage an den Handler für `code` weiter. So antwortest du aus deinem eigenen Code mit 404 für einen nicht vorhandenen Datensatz oder mit 403 für eine verbotene Ressource.

```js controllers/errors.js
exports.install = function() {
	ROUTE('#404', not_found);
	ROUTE('#401', unauthorized);
	ROUTE('GET /items/{id}/', item);
	ROUTE('+GET /private/', private_page);
};

var items = { '1': 'First item' };

function item($) {
	var name = items[$.params.id];
	if (name)
		$.json({ name: name });
	else
		$.fallback(404);
}

function private_page($) {
	$.plain('secret');
}

function not_found($) {
	$.response.status = 404;
	$.html('<h1>Nothing here</h1><p>' + $.url.encode() + ' does not exist.</p>');
}

function unauthorized($) {
	$.response.status = 401;
	$.json({ error: 'Please sign in first' });
}

AUTH(function($) {
	$.invalid();
});
```
