# Route Syntax von Total.js 5

> Erklären Sie Total.js-Routen mit Methoden, URL-Parametern, Wildkarten, Flaggen, Authentifizierung, Mediumware und Aktionen.

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

`ROUTE(definition, handler)` deklariert eine Route. Die Definition ist ein Text mit diesen Teilen in dieser Reihenfolge:

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

| Teil | Bedeutung |
|---|---|
| `METHOD` | `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, oder `SOCKET` für einen WebSocket und `FILE` für URLs mit Endung: Eine URL wie `/a.txt` wird nie von einer `GET`-Route erfasst. |
| `+` oder `-` vor der Methode | `+` akzeptiert nur Anfragen, die `AUTH()` freigegeben hat, `-` nur anonyme; jede andere Anfrage wird mit 401 beantwortet. Ohne Präfix ist die Route offen. |
| `/url/` | Der Pfad. Schreibe den abschließenden Schrägstrich: Routen werden mit ihm verglichen. |
| `{name}` | Ein Pfadsegment, das aus `$.params.name` gelesen wird. |
| `*` als letztes Segment | Passt auf jeden Pfad darunter. Eine Route ohne `*` ist spezifischer und gewinnt. |
| `@flag` | Eine Bedingung für die Anfrage: `@json`, `@xml`, `@xhr`, `@upload`, `@debug`, `@release`, `@mobile`, `@robot`, `@referer` (oder `@referrer`). |
| `#name` | Eine mit `MIDDLEWARE(name, fn)` registrierte Middleware. |
| `<limit` | `<10kb` begrenzt die Größe des Bodys, `<30s` die Dauer der Anfrage. |
| `--> *Action` | Führt eine oder mehrere Actions mit der Eingabe der Anfrage aus und antwortet mit dem Ergebnis. |
| `#404`, `#401`... | Eine Route, deren Definition nur aus `#` und einem Statuscode besteht, ersetzt die Fehlerseite. |

Eine Anfrage wird von der ersten passenden Route behandelt. Eine Anfrage, die die Flags einer Route nicht erfüllt, geht zur nächsten Route weiter und endet mit einem 404, wenn keine passt; eine Anfrage, die `+` oder `-` nicht erfüllt, erhält ein 401. **Eine Route ohne Flags auf derselben URL gewinnt immer gegen eine Route mit Flags**, setze daher nie beide auf eine 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');
}
```
