# De pagina's 404 en 401 aanpassen

> Registreer handlers ROUTE('#404') en ROUTE('#401') om de ingebouwde foutpagina's te vervangen en roep ze zelf aan met $.fallback().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: 438ad58dead63815a8d28e7d1264f6e3f8ca575406d5e6718ba9ad0900ba298b
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Wanneer Total.js een verzoek niet kan afhandelen, toont het een ingebouwde foutpagina. Een route waarvan de URL `#` plus de statuscode is, vervangt die: `ROUTE('#404', fn)` voor "niet gevonden", `ROUTE('#401', fn)` voor "niet geautoriseerd", en hetzelfde voor `#400`, `#431` en andere. De handler krijgt `$` zoals elke route, maar **de status stel je zelf in** met `$.response.status`: Total.js doet dat niet voor je als er een eigen handler bestaat. Zonder eigen handler wordt de ingebouwde pagina gebruikt en krijgen AJAX-verzoeken (header `x-requested-with`) een JSON-fout in plaats van HTML.

`$.fallback(code)` stuurt het huidige verzoek naar de handler voor `code`, zo antwoord je vanuit je eigen code met 404 voor een niet-bestaand record of 403 voor een verboden resource.

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