# Het object van een Total.js 5 handelaar

> Gebruik de eigenschappen en methoden van de beheerder ontvangen door een routehandelaar.

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

Een routehandler ontvangt één object, op deze site geschreven als `$`. Het beschrijft het verzoek en beantwoordt het. Antwoord **één keer**: na `$.json()`, `$.html()` of een ander antwoord is het verzoek afgerond.

## Eigenschappen

| Eigenschap | Type | Wat het is |
|---|---|---|
| `$.url` | string | Het pad van het verzoek, zonder de querystring. |
| `$.method` | string | `GET`, `POST`... |
| `$.query` | object | De querystring, geparsed. |
| `$.params` | object | De `{name}`-segmenten van de route. |
| `$.body` | object | De body, geparsed op basis van het contenttype (JSON, URL-encoded formulier, XML of multipart-velden). |
| `$.files` | array | De geüploade bestanden van een multipart-verzoek. |
| `$.headers` | object | De headers van het verzoek, met namen in kleine letters. |
| `$.ip` | string | Het IP-adres; het eerste adres van `x-forwarded-for` als de header bestaat. |
| `$.host` | string | De header `host`. |
| `$.referrer` | string | De header `referer`. |
| `$.protocol` | string | `http` of `https` (ook als een proxy dat aangeeft in `x-forwarded-proto`). |
| `$.ext` | string | De extensie van de URL, zonder punt (`$.extension` is hetzelfde). |
| `$.xhr` | boolean | `true` als de header `x-requested-with` `XMLHttpRequest` is. |
| `$.mobile` | boolean | `true` als de user agent op een mobiele browser lijkt. |
| `$.robot` | boolean | `true` als de user agent op een crawler lijkt. |
| `$.ua` | string | Een korte naam van de browser en het systeem, zoals `iPhone Safari` of `Windows Chrome`. |
| `$.user` | object | De gebruiker die `AUTH()` heeft goedgekeurd, of niets. |
| `$.language` | string | De taal die `LOCALIZE()` heeft gekozen. |
| `$.datatype` | string | `json`, `urlencoded`, `multipart`, `xml`, `text` of `binary`: het type van de body van het verzoek. |
| `$.response` | object | Wat er wordt verstuurd: `status`, `headers` en `value`. Wijzig `$.response.status` en `$.response.headers` voordat je antwoordt. |
| `$.req`, `$.res` | objects | Het Node.js-verzoek en -antwoord. |

## Methoden die antwoorden

| Methode | Wat het doet | Recept |
|---|---|---|
| `$.json(value)` | Antwoordt met JSON. | [responses](/en/total5/responses/) |
| `$.jsonstring(text)` | Antwoordt met een tekst die al JSON is, zonder die opnieuw te serialiseren. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.html(text)` | Antwoordt met HTML. | [responses](/en/total5/responses/) |
| `$.plain(text)` | Antwoordt met platte tekst (`$.text` is hetzelfde). | [responses](/en/total5/responses/) |
| `$.xml(text)` | Antwoordt met XML. | [responses](/en/total5/responses/) |
| `$.empty()` | Antwoordt met status 204 en zonder body. | [responses](/en/total5/responses/) |
| `$.redirect(url, permanent)` | Verwijst door (302, of 301 als `permanent` true is). | [responses](/en/total5/responses/) |
| `$.binary(buffer, type, name)` | Antwoordt met bytes en een contenttype. | [responses](/en/total5/responses/) |
| `$.file(path, name)` | Verstuurt een bestand van schijf. | [file-download](/en/total5/file-download/) |
| `$.stream(type, stream, name)` | Verstuurt een leesbare stream. | [file-download](/en/total5/file-download/) |
| `$.filefs(storage, id)` | Verstuurt een bestand van een `FILESTORAGE`. | [filestorage](/en/total5/filestorage/) |
| `$.image(options)` | Maakt en verstuurt een afbeelding op aanvraag. | [images](/en/total5/images/) |
| `$.view(name, model)` | Rendert een view met de layout en antwoordt ermee. | [views-and-layouts](/en/total5/views-and-layouts/) |
| `$.layout(name)` | Kiest een andere layout voor de volgende `$.view()`. | [view-sections](/en/total5/view-sections/) |
| `$.proxy(url)` | Stuurt het verzoek door naar een andere URL en antwoordt met het antwoord daarvan. | [proxy](/en/total5/proxy/) |
| `$.respond(value)` | Antwoordt in het formaat van `$.response.output` (`json` als het niet is ingesteld). | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.invalid(value)` | Antwoordt met een fout: een tekst, een statuscode zoals `404` of een `ErrorBuilder`. | [actions-crud](/en/total5/actions-crud/) |
| `$.fallback(code)` | Antwoordt met de pagina van een foutcode, de eigen als `ROUTE('#404')` bestaat. | [error-pages](/en/total5/error-pages/) |
| `$.success(value)` | Antwoordt `{ "success": true }`; `value` wordt eraan toegevoegd. | [responses](/en/total5/responses/) |
| `$.callback(err, value)` | Bij een fout antwoordt het `$.invalid(err)`, anders `$.json(value)`, of `$.success()` als `value` `undefined` is. Zonder argumenten geeft het een functie `(err, response)` terug die hetzelfde doet. | [actions-crud](/en/total5/actions-crud/) |
| `$.successful(fn)` | Geeft een functie `(err, a, b, c)` terug: bij een fout antwoordt ze `$.invalid(err)`, anders roept ze `fn(a, b, c)` aan. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.done(arg)` | Geeft een functie `(err, response)` terug: bij een fout antwoordt ze `$.invalid(err)`, anders met het succesobject. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |

## Andere methoden

| Methode | Wat het doet | Recept |
|---|---|---|
| `$.cookie(name, value, expiration)` | Leest een cookie, of schrijft er een als je een waarde meegeeft. | [headers-and-cookies](/en/total5/headers-and-cookies/) |
| `$.csrf()` | Maakt een CSRF-token voor deze client. | [csrf-protection](/en/total5/csrf-protection/) |
| `$.hostname(path)` | Het adres van deze server: protocol, host en het pad dat je meegeeft. | [restbuilder](/en/total5/restbuilder/) |
| `$.action(name, model)` | Voert een actie uit met dit verzoek (gebruiker, query en params). | [calling-actions-from-code](/en/total5/calling-actions-from-code/) |
| `$.transform(name, value, callback)` | Voert een transformatie uit met dit verzoek. | [transforms](/en/total5/transforms/) |
| `$.authorize(callback)` | Voert `AUTH()` uit voor dit verzoek en stelt `$.user` in; geeft een promise terug als er geen callback is. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.notmodified(date)` | Antwoordt 304 en geeft `true` terug als het verzoek de header `if-modified-since` met die datum heeft. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.httpcache(date)` | Stelt de cacheheaders en `last-modified` van het antwoord in. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.clear()` | Verwijdert de tijdelijke bestanden van de upload. Ze worden hoe dan ook verwijderd als het verzoek eindigt. | [file-upload](/en/total5/file-upload/) |
| `$.autoclear(false)` | Bewaart de geüploade bestanden na het verzoek, zodat je ze later kunt gebruiken. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.custom()` | Zegt tegen het framework dat je zelf antwoordt via `$.res`: het verstuurt niets. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.href(key, value)` | Gebruik `QUERIFY()` zoals in het gelinkte recept, de geteste native helper voor querylinks. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.flush()`, `$.resume()`, `$.free()`, `$.cancel()` | Interne methoden: roep ze niet aan. | - |

Het voorbeeld antwoordt met de eigenschappen en roept de methoden aan die geen voorbereiding nodig hebben.

```js controllers/api.js
exports.install = function() {
	ROUTE('GET /info/{a}/{b}/', info);
	ROUTE('POST /body/ @json', body);
	ROUTE('GET /answers/{kind}/', answers);
	ROUTE('GET /callback/{kind}/', callback);
};

function info($) {
	$.json({
		url: $.url,
		method: $.method,
		query: $.query,
		params: $.params,
		ext: $.ext,
		xhr: $.xhr,
		mobile: $.mobile,
		robot: $.robot,
		ua: $.ua,
		ip: $.ip,
		host: $.host,
		referrer: $.referrer,
		protocol: $.protocol,
		hostname: $.hostname('/x/'),
		datatype: $.datatype
	});
}

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

function answers($) {
	switch ($.params.kind) {
		case 'json': return $.json({ a: 1 });
		case 'jsonstring': return $.jsonstring('{"a":1}');
		case 'html': return $.html('<b>x</b>');
		case 'plain': return $.plain('x');
		case 'xml': return $.xml('<a>1</a>');
		case 'empty': return $.empty();
		case 'redirect': return $.redirect('/x/', true);
		case 'binary': return $.binary(Buffer.from('abc'), 'application/octet-stream');
		case 'invalid': return $.invalid(409);
		case 'success': return $.success({ id: 7 });
		case 'status': $.response.status = 201; return $.json({ created: true });
		case 'header': $.response.headers['x-example'] = 'yes'; return $.json({});
	}
}

function callback($) {
	switch ($.params.kind) {
		case 'error': return $.callback('failed');
		case 'value': return $.callback(null, { v: 1 });
		case 'nothing': return $.callback(null);
		case 'function': return setImmediate($.callback(), null, { later: true });
		case 'successful': return setImmediate($.successful(function(a, b) { $.json({ a: a, b: b }); }), null, 'x', 'y');
	}
}
```
