# Dostosuj strony 404 i 401

> Zarejestruj handlery ROUTE('#404') i ROUTE('#401'), aby zastąpić wbudowane strony błędów, i wywołuj je sam przez $.fallback().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pl
Content-SHA256: 0d86dbe162063c914d4b300488df54911916cec5f9a040698fabde2214a87495
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Gdy Total.js nie może obsłużyć żądania, pokazuje wbudowaną stronę błędu. Trasa, której adres URL to `#` plus kod statusu, ją zastępuje: `ROUTE('#404', fn)` dla „nie znaleziono”, `ROUTE('#401', fn)` dla „brak autoryzacji”, i tak samo dla `#400`, `#431` i innych. Handler dostaje `$` jak każda trasa, ale **status ustawiasz sam** przez `$.response.status`: Total.js nie robi tego za Ciebie, gdy istnieje własny handler. Bez własnego handlera używana jest strona wbudowana, a żądania AJAX (nagłówek `x-requested-with`) dostają błąd JSON zamiast HTML.

`$.fallback(code)` przekazuje bieżące żądanie do handlera dla `code`; w ten sposób z własnego kodu odpowiadasz 404 dla nieistniejącego rekordu albo 403 dla zabronionego zasobu.

```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();
});
```
