L'oggetto di un Total.js 5
Un handler di route riceve un oggetto, scritto $ in questo sito. Descrive la richiesta e vi risponde. Rispondi una sola volta: dopo $.json(), $.html() o qualsiasi altra risposta, la richiesta è terminata.
Proprietà
| Proprietà | Tipo | Cos'è |
|---|---|---|
$.url | string | Il percorso della richiesta, senza la query string. |
$.method | string | GET, POST... |
$.query | object | La query string, analizzata. |
$.params | object | I segmenti {name} della route. |
$.body | object | Il corpo, analizzato in base al tipo di contenuto (JSON, form URL-encoded, XML o campi multipart). |
$.files | array | I file caricati di una richiesta multipart. |
$.headers | object | Gli header della richiesta, con nomi in minuscolo. |
$.ip | string | L'indirizzo IP; il primo indirizzo di x-forwarded-for quando l'header esiste. |
$.host | string | L'header host. |
$.referrer | string | L'header referer. |
$.protocol | string | http o https (anche quando un proxy lo indica in x-forwarded-proto). |
$.ext | string | L'estensione dell'URL, senza il punto ($.extension è lo stesso). |
$.xhr | boolean | true quando l'header x-requested-with è XMLHttpRequest. |
$.mobile | boolean | true quando lo user agent sembra un browser mobile. |
$.robot | boolean | true quando lo user agent sembra un crawler. |
$.ua | string | Un nome breve del browser e del sistema, come iPhone Safari o Windows Chrome. |
$.user | object | L'utente approvato da AUTH(), oppure nulla. |
$.language | string | La lingua scelta da LOCALIZE(). |
$.datatype | string | json, urlencoded, multipart, xml, text o binary: il tipo del corpo della richiesta. |
$.response | object | Ciò che verrà inviato: status, headers e value. Cambia $.response.status e $.response.headers prima di rispondere. |
$.req, $.res | objects | La richiesta e la risposta di Node.js. |
Metodi che rispondono
| Metodo | Cosa fa | Ricetta |
|---|---|---|
$.json(value) | Risponde con JSON. | responses |
$.jsonstring(text) | Risponde con un testo che è già JSON, senza serializzarlo di nuovo. | controller-completion-and-cache |
$.html(text) | Risponde con HTML. | responses |
$.plain(text) | Risponde con testo semplice ($.text è lo stesso). | responses |
$.xml(text) | Risponde con XML. | responses |
$.empty() | Risponde con stato 204 e senza corpo. | responses |
$.redirect(url, permanent) | Reindirizza (302, o 301 quando permanent è true). | responses |
$.binary(buffer, type, name) | Risponde con byte e un tipo di contenuto. | responses |
$.file(path, name) | Invia un file dal disco. | file-download |
$.stream(type, stream, name) | Invia uno stream leggibile. | file-download |
$.filefs(storage, id) | Invia un file di un FILESTORAGE. | filestorage |
$.image(options) | Crea e invia un'immagine su richiesta. | images |
$.view(name, model) | Renderizza una vista con il layout e risponde con essa. | views-and-layouts |
$.layout(name) | Sceglie un altro layout per il prossimo $.view(). | view-sections |
$.proxy(url) | Inoltra la richiesta a un altro URL e risponde con la sua risposta. | proxy |
$.respond(value) | Risponde nel formato di $.response.output (json quando non è impostato). | controller-completion-and-cache |
$.invalid(value) | Risponde con un errore: un testo, un codice di stato come 404 o un ErrorBuilder. | actions-crud |
$.fallback(code) | Risponde con la pagina di un codice di errore, quella personalizzata quando esiste ROUTE('#404'). | error-pages |
$.success(value) | Risponde { "success": true }; value viene aggiunto. | responses |
$.callback(err, value) | Con un errore risponde $.invalid(err), altrimenti $.json(value), oppure $.success() quando value è undefined. Senza argomenti restituisce una funzione (err, response) che fa lo stesso. | actions-crud |
$.successful(fn) | Restituisce una funzione (err, a, b, c): con un errore risponde $.invalid(err), altrimenti chiama fn(a, b, c). | controller-completion-and-cache |
$.done(arg) | Restituisce una funzione (err, response): con un errore risponde $.invalid(err), altrimenti risponde con l'oggetto di successo. | controller-completion-and-cache |
Altri metodi
| Metodo | Cosa fa | Ricetta |
|---|---|---|
$.cookie(name, value, expiration) | Legge un cookie, o ne scrive uno quando passi un valore. | headers-and-cookies |
$.csrf() | Crea un token CSRF per questo client. | csrf-protection |
$.hostname(path) | L'indirizzo di questo server: protocollo, host e il percorso che passi. | restbuilder |
$.action(name, model) | Esegue un'azione con questa richiesta (utente, query e params). | calling-actions-from-code |
$.transform(name, value, callback) | Esegue una trasformazione con questa richiesta. | transforms |
$.authorize(callback) | Esegue AUTH() per questa richiesta e imposta $.user; restituisce una promise quando non c'è callback. | controller-completion-and-cache |
$.notmodified(date) | Risponde 304 e restituisce true quando la richiesta ha l'header if-modified-since con quella data. | controller-completion-and-cache |
$.httpcache(date) | Imposta gli header di cache e last-modified della risposta. | controller-completion-and-cache |
$.clear() | Rimuove i file temporanei dell'upload. Vengono comunque rimossi quando la richiesta termina. | file-upload |
$.autoclear(false) | Mantiene i file caricati dopo la richiesta, così puoi usarli in seguito. | upload-lifecycle-and-href |
$.custom() | Dice al framework che rispondi tu stesso tramite $.res: non invierà nulla. | controller-completion-and-cache |
$.href(key, value) | Usa QUERIFY() come nella ricetta collegata, l’helper nativo testato per i link con query. | upload-lifecycle-and-href |
$.flush(), $.resume(), $.free(), $.cancel() | Metodi interni: non chiamarli. |
L'esempio risponde con le proprietà e chiama i metodi che non richiedono preparazione.
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');
}
}