# Route syntax van Total.js 5

> Verklar Total.js routes met methoden, URL-parameters, wildkaarten, vlaggen, authenticatie, middenware en acties.

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

`ROUTE(definition, handler)` declareert een route. De definitie is één tekst met deze onderdelen, in deze volgorde:

`[+|-]METHOD /url/{param}/ [@flag ...] [#middleware ...] [<limit] [--> *Action ...]`

| Onderdeel | Betekenis |
|---|---|
| `METHOD` | `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, of `SOCKET` voor een WebSocket en `FILE` voor URL's met een extensie: een URL zoals `/a.txt` wordt nooit door een `GET`-route opgevangen. |
| `+` of `-` voor de methode | `+` accepteert alleen verzoeken die `AUTH()` heeft goedgekeurd, `-` alleen anonieme; elk ander verzoek krijgt een 401. Zonder voorvoegsel is de route open. |
| `/url/` | Het pad. Schrijf de slash aan het einde: routes worden ermee vergeleken. |
| `{name}` | Een padsegment dat wordt gelezen uit `$.params.name`. |
| `*` als laatste segment | Komt overeen met elk pad eronder. Een route zonder `*` is specifieker en wint. |
| `@flag` | Een voorwaarde voor het verzoek: `@json`, `@xml`, `@xhr`, `@upload`, `@debug`, `@release`, `@mobile`, `@robot`, `@referer` (of `@referrer`). |
| `#name` | Een middleware geregistreerd met `MIDDLEWARE(name, fn)`. |
| `<limit` | `<10kb` beperkt de grootte van de body, `<30s` de duur van het verzoek. |
| `--> *Action` | Voert een of meer acties uit met de invoer van het verzoek en antwoordt met het resultaat. |
| `#404`, `#401`... | Een route waarvan de definitie alleen `#` en een statuscode is, vervangt de foutpagina. |

Een verzoek wordt afgehandeld door de eerste overeenkomende route. Een verzoek dat niet aan de flags van een route voldoet, gaat door naar de volgende route en eindigt met een 404 als er geen overeenkomt; een verzoek dat niet aan `+` of `-` voldoet, krijgt een 401. **Een route zonder flags op dezelfde URL wint altijd van een route met flags**, zet ze dus nooit allebei op één URL.

```js definitions/auth.js
AUTH(function($) {
	if ($.headers['x-token'] === 'secret')
		$.success({ id: '1' });
	else
		$.invalid();
});

MIDDLEWARE('stamp', function($, next) {
	$.response.headers['x-stamp'] = 'yes';
	next();
});

NEWACTION('Echo/one', { name: 'one', input: '*text:String', action: ($, model) => $.callback({ one: model.text }) });
NEWACTION('Echo/two', { name: 'two', action: ($, model) => $.callback({ two: true }) });
```

```js controllers/syntax.js
exports.install = function() {
	ROUTE('GET /plain/', plain);
	ROUTE('GET /users/{id}/', user);
	ROUTE('GET /files/*', files);
	ROUTE('POST /json/ @json', json);
	ROUTE('+GET /private/', plain);
	ROUTE('-GET /guest/', plain);
	ROUTE('GET /stamped/ #stamp', plain);
	ROUTE('POST /echo/ @json --> *Echo/one');
	ROUTE('FILE /robots-example.txt', file);
	ROUTE('#404', missing);
};

function plain($) {
	$.json({ ok: true });
}

function user($) {
	$.json({ id: $.params.id });
}

function files($) {
	$.json({ url: $.url });
}

function json($) {
	$.json({ body: $.body });
}

function file($) {
	$.plain('from a FILE route');
}

function missing($) {
	$.response.status = 404;
	$.plain('custom 404');
}
```
