# Obiectul unui Total.js 5

> Utilizați proprietățile și metodele controlorului primite de un operator rutier.

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

Un handler de rută primește un obiect, scris `$` pe acest site. Descrie cererea și îi răspunde. Răspunde **o singură dată**: după `$.json()`, `$.html()` sau orice alt răspuns, cererea s-a terminat.

## Proprietăți

| Proprietate | Tip | Ce este |
|---|---|---|
| `$.url` | string | Calea cererii, fără șirul de interogare. |
| `$.method` | string | `GET`, `POST`... |
| `$.query` | object | Șirul de interogare, analizat. |
| `$.params` | object | Segmentele `{name}` ale rutei. |
| `$.body` | object | Corpul, analizat după tipul de conținut (JSON, formular URL-encoded, XML sau câmpuri multipart). |
| `$.files` | array | Fișierele încărcate ale unei cereri multipart. |
| `$.headers` | object | Antetele cererii, cu nume cu litere mici. |
| `$.ip` | string | Adresa IP; prima adresă din `x-forwarded-for` când antetul există. |
| `$.host` | string | Antetul `host`. |
| `$.referrer` | string | Antetul `referer`. |
| `$.protocol` | string | `http` sau `https` (și când un proxy o indică în `x-forwarded-proto`). |
| `$.ext` | string | Extensia URL-ului, fără punct (`$.extension` este la fel). |
| `$.xhr` | boolean | `true` când antetul `x-requested-with` este `XMLHttpRequest`. |
| `$.mobile` | boolean | `true` când user agent-ul arată ca un browser mobil. |
| `$.robot` | boolean | `true` când user agent-ul arată ca un crawler. |
| `$.ua` | string | Un nume scurt al browserului și al sistemului, precum `iPhone Safari` sau `Windows Chrome`. |
| `$.user` | object | Utilizatorul aprobat de `AUTH()`, sau nimic. |
| `$.language` | string | Limba aleasă de `LOCALIZE()`. |
| `$.datatype` | string | `json`, `urlencoded`, `multipart`, `xml`, `text` sau `binary`: tipul corpului cererii. |
| `$.response` | object | Ce va fi trimis: `status`, `headers` și `value`. Schimbă `$.response.status` și `$.response.headers` înainte de a răspunde. |
| `$.req`, `$.res` | objects | Cererea și răspunsul Node.js. |

## Metode care răspund

| Metodă | Ce face | Rețetă |
|---|---|---|
| `$.json(value)` | Răspunde cu JSON. | [responses](/en/total5/responses/) |
| `$.jsonstring(text)` | Răspunde cu un text care este deja JSON, fără a-l serializa din nou. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.html(text)` | Răspunde cu HTML. | [responses](/en/total5/responses/) |
| `$.plain(text)` | Răspunde cu text simplu (`$.text` este la fel). | [responses](/en/total5/responses/) |
| `$.xml(text)` | Răspunde cu XML. | [responses](/en/total5/responses/) |
| `$.empty()` | Răspunde cu statusul 204 și fără corp. | [responses](/en/total5/responses/) |
| `$.redirect(url, permanent)` | Redirecționează (302, sau 301 când `permanent` este true). | [responses](/en/total5/responses/) |
| `$.binary(buffer, type, name)` | Răspunde cu octeți și un tip de conținut. | [responses](/en/total5/responses/) |
| `$.file(path, name)` | Trimite un fișier de pe disc. | [file-download](/en/total5/file-download/) |
| `$.stream(type, stream, name)` | Trimite un stream care poate fi citit. | [file-download](/en/total5/file-download/) |
| `$.filefs(storage, id)` | Trimite un fișier dintr-un `FILESTORAGE`. | [filestorage](/en/total5/filestorage/) |
| `$.image(options)` | Creează și trimite o imagine la cerere. | [images](/en/total5/images/) |
| `$.view(name, model)` | Randează o vizualizare cu layout și răspunde cu ea. | [views-and-layouts](/en/total5/views-and-layouts/) |
| `$.layout(name)` | Alege un alt layout pentru următorul `$.view()`. | [view-sections](/en/total5/view-sections/) |
| `$.proxy(url)` | Redirecționează cererea către alt URL și răspunde cu răspunsul acestuia. | [proxy](/en/total5/proxy/) |
| `$.respond(value)` | Răspunde în formatul `$.response.output` (`json` când nu este setat). | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.invalid(value)` | Răspunde cu o eroare: un text, un cod de stare precum `404` sau un `ErrorBuilder`. | [actions-crud](/en/total5/actions-crud/) |
| `$.fallback(code)` | Răspunde cu pagina unui cod de eroare, cea personalizată când există `ROUTE('#404')`. | [error-pages](/en/total5/error-pages/) |
| `$.success(value)` | Răspunde `{ "success": true }`; `value` este adăugat la el. | [responses](/en/total5/responses/) |
| `$.callback(err, value)` | Cu o eroare răspunde `$.invalid(err)`, altfel `$.json(value)`, sau `$.success()` când `value` este `undefined`. Fără argumente returnează o funcție `(err, response)` care face același lucru. | [actions-crud](/en/total5/actions-crud/) |
| `$.successful(fn)` | Returnează o funcție `(err, a, b, c)`: cu o eroare răspunde `$.invalid(err)`, altfel apelează `fn(a, b, c)`. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.done(arg)` | Returnează o funcție `(err, response)`: cu o eroare răspunde `$.invalid(err)`, altfel răspunde cu obiectul de succes. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |

## Alte metode

| Metodă | Ce face | Rețetă |
|---|---|---|
| `$.cookie(name, value, expiration)` | Citește un cookie sau scrie unul când transmiți o valoare. | [headers-and-cookies](/en/total5/headers-and-cookies/) |
| `$.csrf()` | Creează un token CSRF pentru acest client. | [csrf-protection](/en/total5/csrf-protection/) |
| `$.hostname(path)` | Adresa acestui server: protocol, gazdă și calea pe care o transmiți. | [restbuilder](/en/total5/restbuilder/) |
| `$.action(name, model)` | Rulează o acțiune cu această cerere (utilizator, query și params). | [calling-actions-from-code](/en/total5/calling-actions-from-code/) |
| `$.transform(name, value, callback)` | Rulează o transformare cu această cerere. | [transforms](/en/total5/transforms/) |
| `$.authorize(callback)` | Rulează `AUTH()` pentru această cerere și setează `$.user`; returnează un promise când nu există callback. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.notmodified(date)` | Răspunde 304 și returnează `true` când cererea are antetul `if-modified-since` cu acea dată. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.httpcache(date)` | Setează antetele de cache și `last-modified` ale răspunsului. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.clear()` | Șterge fișierele temporare ale încărcării. Sunt șterse oricum când cererea se termină. | [file-upload](/en/total5/file-upload/) |
| `$.autoclear(false)` | Păstrează fișierele încărcate după cerere, pentru a le putea folosi mai târziu. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.custom()` | Spune framework-ului că răspunzi tu însuți prin `$.res`: nu va trimite nimic. | [controller-completion-and-cache](/en/total5/controller-completion-and-cache/) |
| `$.href(key, value)` | Folosește `QUERIFY()` ca în rețeta legată, helperul nativ testat pentru linkuri cu query. | [upload-lifecycle-and-href](/en/total5/upload-lifecycle-and-href/) |
| `$.flush()`, `$.resume()`, `$.free()`, `$.cancel()` | Metode interne: nu le apela. | - |

Exemplul răspunde cu proprietățile și apelează metodele care nu necesită pregătire.

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