# Das Objekt eines Total.js 5 Handlers

> Verwenden Sie die Eigenschaften und Methoden des Steuerers, die von einem Routenhandler erhalten werden.

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

Ein Routen-Handler erhält ein Objekt, auf dieser Seite `$` geschrieben. Es beschreibt die Anfrage und beantwortet sie. Antworte **nur einmal**: Nach `$.json()`, `$.html()` oder einer anderen Antwort ist die Anfrage beendet.

## Eigenschaften

| Eigenschaft | Typ | Was es ist |
|---|---|---|
| `$.url` | string | Der Pfad der Anfrage ohne Query-String. |
| `$.method` | string | `GET`, `POST`... |
| `$.query` | object | Der Query-String, geparst. |
| `$.params` | object | Die `{name}`-Segmente der Route. |
| `$.body` | object | Der Body, geparst nach seinem Content-Type (JSON, URL-kodiertes Formular, XML oder Multipart-Felder). |
| `$.files` | array | Die hochgeladenen Dateien einer Multipart-Anfrage. |
| `$.headers` | object | Die Header der Anfrage mit Namen in Kleinbuchstaben. |
| `$.ip` | string | Die IP-Adresse; die erste Adresse aus `x-forwarded-for`, wenn der Header existiert. |
| `$.host` | string | Der Header `host`. |
| `$.referrer` | string | Der Header `referer`. |
| `$.protocol` | string | `http` oder `https` (auch wenn ein Proxy es in `x-forwarded-proto` angibt). |
| `$.ext` | string | Die Endung der URL ohne Punkt (`$.extension` ist dasselbe). |
| `$.xhr` | boolean | `true`, wenn der Header `x-requested-with` `XMLHttpRequest` ist. |
| `$.mobile` | boolean | `true`, wenn der User-Agent wie ein mobiler Browser aussieht. |
| `$.robot` | boolean | `true`, wenn der User-Agent wie ein Crawler aussieht. |
| `$.ua` | string | Ein kurzer Name von Browser und System, etwa `iPhone Safari` oder `Windows Chrome`. |
| `$.user` | object | Der Benutzer, den `AUTH()` freigegeben hat, oder nichts. |
| `$.language` | string | Die Sprache, die `LOCALIZE()` gewählt hat. |
| `$.datatype` | string | `json`, `urlencoded`, `multipart`, `xml`, `text` oder `binary`: der Typ des Bodys der Anfrage. |
| `$.response` | object | Was gesendet wird: `status`, `headers` und `value`. Ändere `$.response.status` und `$.response.headers`, bevor du antwortest. |
| `$.req`, `$.res` | objects | Die Node.js-Anfrage und -Antwort. |

## Methoden, die antworten

| Methode | Was sie tut | Rezept |
|---|---|---|
| `$.json(value)` | Antwortet mit JSON. | [responses](/en/total5/responses/) |
| `$.jsonstring(text)` | Antwortet mit einem Text, der bereits JSON ist, ohne ihn erneut zu serialisieren. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.html(text)` | Antwortet mit HTML. | [responses](/en/total5/responses/) |
| `$.plain(text)` | Antwortet mit reinem Text (`$.text` ist dasselbe). | [responses](/en/total5/responses/) |
| `$.xml(text)` | Antwortet mit XML. | [responses](/en/total5/responses/) |
| `$.empty()` | Antwortet mit Status 204 und ohne Body. | [responses](/en/total5/responses/) |
| `$.redirect(url, permanent)` | Leitet um (302, oder 301, wenn `permanent` true ist). | [responses](/en/total5/responses/) |
| `$.binary(buffer, type, name)` | Antwortet mit Bytes und einem Content-Type. | [responses](/en/total5/responses/) |
| `$.file(path, name)` | Sendet eine Datei von der Festplatte. | [file-download](/en/total5/file-download/) |
| `$.stream(type, stream, name)` | Sendet einen lesbaren Stream. | [file-download](/en/total5/file-download/) |
| `$.filefs(storage, id)` | Sendet eine Datei aus einem `FILESTORAGE`. | [filestorage](/en/total5/filestorage/) |
| `$.image(options)` | Erzeugt und sendet ein Bild auf Anfrage. | [images](/en/total5/images/) |
| `$.view(name, model)` | Rendert eine View mit dem Layout und antwortet damit. | [views-and-layouts](/en/total5/views-and-layouts/) |
| `$.layout(name)` | Wählt ein anderes Layout für das nächste `$.view()`. | [view-sections](/en/total5/view-sections/) |
| `$.proxy(url)` | Leitet die Anfrage an eine andere URL weiter und antwortet mit deren Antwort. | [proxy](/en/total5/proxy/) |
| `$.respond(value)` | Antwortet im Format von `$.response.output` (`json`, wenn nicht gesetzt). | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.invalid(value)` | Antwortet mit einem Fehler: einem Text, einem Statuscode wie `404` oder einem `ErrorBuilder`. | [actions-crud](/en/total5/actions-crud/) |
| `$.fallback(code)` | Antwortet mit der Seite eines Fehlercodes, der eigenen, wenn `ROUTE('#404')` existiert. | [error-pages](/en/total5/error-pages/) |
| `$.success(value)` | Antwortet `{ "success": true }`; `value` wird hinzugefügt. | [responses](/en/total5/responses/) |
| `$.callback(err, value)` | Bei einem Fehler antwortet es `$.invalid(err)`, sonst `$.json(value)`, oder `$.success()`, wenn `value` `undefined` ist. Ohne Argumente liefert es eine Funktion `(err, response)`, die dasselbe tut. | [actions-crud](/en/total5/actions-crud/) |
| `$.successful(fn)` | Liefert eine Funktion `(err, a, b, c)`: Bei einem Fehler antwortet sie `$.invalid(err)`, sonst ruft sie `fn(a, b, c)` auf. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.done(arg)` | Liefert eine Funktion `(err, response)`: Bei einem Fehler antwortet sie `$.invalid(err)`, sonst mit dem Erfolgsobjekt. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |

## Weitere Methoden

| Methode | Was sie tut | Rezept |
|---|---|---|
| `$.cookie(name, value, expiration)` | Liest ein Cookie oder schreibt eines, wenn du einen Wert übergibst. | [headers-and-cookies](/en/total5/headers-and-cookies/) |
| `$.csrf()` | Erzeugt ein CSRF-Token für diesen Client. | [csrf-protection](/en/total5/csrf-protection/) |
| `$.hostname(path)` | Die Adresse dieses Servers: Protokoll, Host und der übergebene Pfad. | [restbuilder](/en/total5/restbuilder/) |
| `$.action(name, model)` | Führt eine Action mit dieser Anfrage aus (Benutzer, Query und Params). | [calling-actions-from-code](/en/total5/calling-actions-from-code/) |
| `$.transform(name, value, callback)` | Führt eine Transformation mit dieser Anfrage aus. | [transforms](/en/total5/transforms/) |
| `$.authorize(callback)` | Führt `AUTH()` für diese Anfrage aus und setzt `$.user`; ohne Callback liefert es ein Promise. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.notmodified(date)` | Antwortet 304 und liefert `true`, wenn die Anfrage den Header `if-modified-since` mit diesem Datum hat. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.httpcache(date)` | Setzt die Cache-Header und `last-modified` der Antwort. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.clear()` | Entfernt die temporären Dateien des Uploads. Sie werden ohnehin am Ende der Anfrage entfernt. | [file-upload](/en/total5/file-upload/) |
| `$.autoclear(false)` | Behält die hochgeladenen Dateien nach der Anfrage, damit du sie später verwenden kannst. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.custom()` | Teilt dem Framework mit, dass du selbst über `$.res` antwortest: Es sendet nichts. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.href(key, value)` | Verwenden Sie `QUERIFY()` wie im verlinkten Rezept, dem getesteten nativen Helfer für Query-Links. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.flush()`, `$.resume()`, `$.free()`, `$.cancel()` | Interne Methoden: nicht aufrufen. | - |

Das Beispiel antwortet mit den Eigenschaften und ruft die Methoden auf, die keine Vorbereitung brauchen.

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