Total.js 5 (backend)
Rute, acțiuni, scheme, baze de date, WebSocket, vizualizări și tot ce rulează pe server.
Validarea unui body JSON cu o acțiune
Definește o schemă de intrare pe o acțiune și lasă Total.js să respingă cererile invalide înainte să ruleze codul tău.
Expunerea acțiunilor printr-un singur endpoint API
Declară endpoint-uri ROUTE('API ...') ca un client să poată apela multe acțiuni cu POST {schema, data} pe un singur URL.
Citirea parametrilor URL într-o rută
Declară segmente dinamice precum {id} într-o rută și citește-le din $.params.
Prinderea multor URL-uri cu o rută wildcard
Încheie o rută cu * ca să potrivești tot ce se află sub o cale și păstrează rute specifice pentru excepții.
Tratarea fiecărei metode HTTP
Declară rute pentru GET, POST, PUT, PATCH și DELETE și citește metoda din $.method.
Restrângerea unei rute cu flag-uri
Adaugă @flag-uri precum @json, @xml sau @upload ca o rută să se potrivească doar cererilor pentru care este făcută.
Citirea query string-ului și a body-ului cererii
Folosește $.query pentru parametrii URL-ului și $.body pentru date JSON sau de formular într-un handler de rută.
Limitarea dimensiunii payload-ului și a timeout-ului unei rute
Adaugă <1kb sau <10s unei rute ca să plafonezi dimensiunea cererii sau timpul pe care îl poate lua handler-ul.
Declararea parametrilor tipizați ai rutei într-o acțiune
Folosește opțiunea params din NEWACTION ca Total.js să valideze parametrii URL-ului înainte să ruleze codul tău.
Alegerea modului de a răspunde
Trimite JSON, HTML, text simplu, XML, redirecționări, răspunsuri goale sau date binare dintr-un handler de rută.
Citirea antetelor și lucrul cu cookie-uri
Citește antetele cererii din $.headers, citește și scrie cookie-uri cu $.cookie() și setează antete de răspuns.
Primirea încărcărilor de fișiere
Acceptă multipart/form-data cu flag-ul @upload și citește fișierele încărcate din $.files.
Permiterea cererilor între origini cu CORS
Apelează CORS() ca o origine, mai multe origini sau toate originile să poată folosi rutele tale dintr-un browser.
Randarea unei vizualizări fără a scrie un handler
O rută fără handler randează vizualizarea numită după URL-ul ei sau vizualizarea pe care o indici.
Selectați tipul corect de intrare pentru o acțiune
Alegeți tipurile de intrare, parametri, întrebări și definiții de ieșire, inclusiv conversii și valori respinse.
Validarea query string-ului într-o acțiune
Declară query în NEWACTION pentru a valida și converti parametrii URL-ului și citește valorile curățate din $.query.
Filtrarea răspunsului unei acțiuni cu output
Declară output ca din acțiune să iasă doar câmpurile enumerate, de exemplu ca să nu scapi niciodată hash-ul unei parole.
Cerința unui utilizator sau a unei permisiuni într-o acțiune
Folosește opțiunile user și permissions din NEWACTION ca autorizarea să stea lângă acțiune, nu în fiecare rută.
Protejarea rutelor cu AUTH
Autentifică fiecare cerere cu AUTH() și limitează rutele la utilizatori autentificați sau anonimi cu prefixele + și -.
Declararea rutei în interiorul acțiunii
Pune ruta în opțiunea route din NEWACTION și ține URL-ul, validarea și codul într-un singur loc.
Autentificarea utilizatorilor cu autentificarea prin sesiune integrată
Dă un obiect de opțiuni lui AUTH() ca să primești cookie-uri de sesiune semnate, un depozit de sesiuni și delogare fără să scrii infrastructura.
Apelarea unei acțiuni din propriul cod
Folosește ACTION() pentru a rula o acțiune dintr-un temporizator, un job sau altă acțiune, cu propriul payload, query și utilizator.
Înlănțuirea mai multor acțiuni într-o rută
Enumeră mai multe acțiuni după --> pentru a le rula pe rând peste același payload și marchează care răspunde cu (response).
Adăugarea unui middleware la o rută
Înregistrează un middleware cu MIDDLEWARE() și atașează-l rutelor cu flag-ul #name.
Construirea unui chat WebSocket
Declară o rută SOCKET, ascultă mesaje și transmite-le tuturor clienților conectați.
Conectarea la un server WebSocket din Node
Folosește WEBSOCKETCLIENT ca să deschizi o conexiune WebSocket din aplicația ta, să trimiți mesaje și să reacționezi la răspunsuri.
Decuplarea codului cu evenimente
Emite și ascultă evenimente ale aplicației cu EMIT(), ON(), ONCE() și OFF(), ca modulele să nu se apeleze direct.
Stocarea și citirea datelor cu baza de date NoSQL integrată
Inserează și interoghează documente cu NOSQL() și expune-le prin acțiuni, fără să instalezi vreo bază de date.
Interogarea bazei de date NoSQL
Filtrează, sortează, paginează și proiectează documente cu where, in, between, search, sort, take, skip și fields.
Actualizarea și ștergerea documentelor NoSQL
Modifică documente cu update() și where(), șterge-le cu remove() și citește câte au fost afectate.
Folosirea API-ului DATA pentru a schimba baza de date
DATA adresează un tabel ca bază/tabel, așa că același cod de interogări funcționează cu NoSQL-ul integrat și cu alte baze de date.
Păstrarea valorilor în cache în memorie
Salvează valori cu CACHE.set() și o expirare, citește-le cu CACHE.get() și șterge-le cu remove() sau reset().
Păstrarea persistentă a unor setări mici cu MEMORIZE
Ține pe disc un obiect JSON care supraviețuiește repornirilor, pentru contoare și setări care nu au nevoie de o bază de date.
Generarea de id-uri unice și de hash-uri
Creează id-uri cu UID() și GUID() și hash-uri cu HASH() și știi pe care să-l folosești unde.
Păstrarea în cache pe disc a rezultatelor lente cu FILECACHE
Folosește FILECACHE() ca să calculezi un rezultat o singură dată și să-l refolosești dintr-un fișier o perioadă, chiar și după o repornire.
Stocarea fișierelor încărcate cu FILESTORAGE
Salvează încărcările într-un depozit de fișiere gestionat cu file.fs() și trimite-le înapoi cu $.filefs().
Randarea unei vizualizări cu un layout
Randează o vizualizare HTML cu un model, parcurge date și dă valori layout-ului.
Folosirea condițiilor și a escapării în vizualizări
Ramifică cu @{if}, @{else} și @{fi} și alege între ieșirea escapată @{value} și HTML brut @{!value}.
Parcurgerea array-urilor și a obiectelor în vizualizări
Repetă marcajul cu @{foreach} pentru array-uri și obiecte și folosește indexul elementului curent.
Includerea vizualizărilor și a resurselor
Refolosește marcajul cu @{view()} și adaugă scripturi și stiluri cu @{import()}.
Completarea secțiunilor layout-ului dintr-o vizualizare
Declară o secțiune într-o vizualizare cu @{section} și afișeaz-o în layout cu @{section('name')}, și alege alt layout pentru fiecare cerere.
Adăugarea de helperi de vizualizare și citirea config-ului în vizualizări
Înregistrează funcții în DEF.helpers ca să le apelezi din vizualizări și citește valori din config cu @{'%key'}.
Convertirea Markdown în HTML
Folosește prototipul String.markdown() ca să randezi text Markdown în HTML, pentru conținut stocat de utilizatori sau în fișiere.
Generarea de text cu șabloane Tangular
Folosește Tangular.render() ca să completezi șabloane pentru e-mailuri, documente și mesaje cu condiții, bucle și helperi.
Randează șabloane din text, fișiere și URL-uri cu TEMPLATE
Folosește TEMPLATE() pentru a randa un șablon Tangular care este un text, un fișier din folderul de șabloane sau un URL, cu proprii helperi și un model implicit.
Compară două liste cu DIFFARR: ce se adaugă, se actualizează și se elimină
Folosește DIFFARR() pentru a compara elementele salvate în baza de date cu cele ale unui formular și a obține cele de adăugat, de actualizat și de eliminat.
Constructor de căutare: DB() și NEWDB() cu propriul driver de bază
Construiți întrebări cu DB().find().where().sort() și lăsați un șofer înregistrat cu NEWDB() să le execute, în timp ce un șofer înregistrat implementează operațiunile de bază.
Configurarea aplicației cu fișierul config
Ține setările într-un fișier config și citește-le prin CONF.
Criptarea și decriptarea datelor cu o cheie
Transformă obiecte în token-uri opace cu ENCRYPT() și citește-le înapoi cu DECRYPT(), pentru linkuri semnate și token-uri de scurtă durată.
Apelează servicii externe cu API() și driverele din NEWAPI()
Înregistrează un driver pentru un serviciu cu NEWAPI() și apelează-l din acțiuni cu API(name, schema, data), în același stil de callback, eroare și promisiune ca query builder.
Vorbește la modele de limbă cu AIMODEL(), NEWAIMODel() și AIPARSER()
Construiți o cerere de chat cu AIMODEL(), lăsați un șofer înregistrat cu NEWAIMODL() să-l trimită unui furnizor și citiți răspunsurile transmise cu AIPARSER().
Limitarea încercărilor eșuate cu BLOCKED
Numără încercările pe adresă IP cu BLOCKED() și răspunde 429 când limita este atinsă, pentru autentificări și resetări de parolă.
Ajutorii globali mici: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY și PROMISIFY
Utilizați globale de aplicații, date, copii adânci, linii de interogare și asistente promise.
Adună erori cu ErrorBuilder, înregistrează-le cu ERROR() și păstrează o urmă de audit cu AUDIT()
Răspunde cu mai multe erori deodată folosind ErrorBuilder, răspunsul SUCCESS(), cum înregistrează ERROR() eșecurile și cum adaugă AUDIT() într-un fișier de jurnal cine a făcut ce.
Amână lucrul cu setTimeout2() și clearTimeout2()
Folosește setTimeout2() pentru a rula o funcție o singură dată după ce apelurile încetează, înlocuind temporizatorul anterior cu același id, și anulează-l cu clearTimeout2().
Tokenuri legate de un browser cu ENCRYPTREQ() și DECRYPTREQ()
Criptează o valoare împreună cu user agent-ul (și opțional adresa IP) cererii și citește-o înapoi doar de la același client.
Fă backup unui folder cu BACKUP() și RESTORE() și rulează comenzi cu SHELL()
Împachetează un director într-un singur fișier și despachetează-l din nou cu BACKUP() și RESTORE(), și rulează o comandă de shell în folderul proiectului cu SHELL().
Pune aplicația în mentenanță cu PAUSESERVER()
Pune serverul în pauză după nume, astfel încât fiecare cerere să primească o pagină 503, reia-l și ține minte că fără al doilea argument apelul alternează starea.
Reguli de afaceri ca text cu NEWMACRO()
Compilează reguli mici scrise într-un limbaj simplu (IF, ELSE, AND, OR, RETURN, apeluri de helperi) într-o funcție pe care o rulezi cu un model, astfel încât regulile să poată trăi într-un fișier sau într-o bază de date.
Servirea fișierelor statice din folderul public
Fișierele din directorul public se servesc automat, fără nevoie de rută.
Apelează o altă adresă cu AJAX() de pe server
Folosește AJAX() pentru a apela o adresă HTTP cu un corp JSON și a primi răspunsul parsat, ca promisiune sau cu callback, și știi ce se întâmplă cu erorile și cu XML.
Apelarea altor API-uri HTTP cu RESTBuilder
Fă cereri GET și POST către alt serviciu, setează antete și un timeout și citește statusul și răspunsul interpretat.
Eliberează un stream când se termină cu CLEANUP()
Folosește CLEANUP() pentru a distruge un stream imediat ce s-a terminat sau a eșuat, ca să nu rămână deschise handle-uri de fișier, cu un callback sau ca promisiune.
Traducerea unei vizualizări în mai multe limbi
Marchează textele din vizualizări cu @(...) și oferă traducerile în fișiere de resurse alese de LOCALIZE().
Rulează cod după un program cu CRON
Înregistrează o funcție cu CRON() și o linie cron cu cinci câmpuri și află când rulează verificarea și cum elimini o sarcină.
Rulează muncă grea într-un thread sau într-un proces copil
Folosește NEWTHREAD() pentru a porni un thread worker, a-i trimite mesaje și a citi răspunsurile fără a bloca procesul principal.
Împarte câteva fire de lucru cu NEWTHREADPOOL()
Pornește un număr fix de workeri, împrumută unul cu pool.exec() când există de lucru, dă-l înapoi cu release() și lasă celelalte sarcini să aștepte un worker liber.
Apelează alte servere cu REQUEST și salvează fișiere cu DOWNLOAD
Folosește REQUEST() pentru apeluri HTTP de nivel scăzut cu control deplin asupra metodei, antetelor, query-ului și corpului, și DOWNLOAD() pentru a transmite un fișier de la distanță pe disc.
Trimite un e-mail dintr-un view
Configurează SMTP în fișierul config, randează un view ca și corp al mesajului cu MAIL() și trimite HTML gata făcut cu HTMLMAIL().
Personalizează paginile 404 și 401
Înregistrează handlere ROUTE('#404') și ROUTE('#401') pentru a înlocui paginile de eroare încorporate și declanșează-le singur cu $.fallback().
Trimite-ți un mesaj cu LOGMAIL()
Trimite un mesaj text simplu sau JSON la o adresă fără view, pentru jurnale și alerte, prin aceleași setări SMTP ca MAIL().
Trimite fișiere și stream-uri către client
Servește un fișier de pe disc cu $.file(), impune un nume de descărcare, transmite conținut generat cu $.stream() și răspunde cu 404 când fișierul lipsește.
Redirecționează cereri către un alt server
Folosește PROXY() pentru a asocia un prefix de URL cu un server din amonte, alege cum se copiază calea și $.proxy() pentru a redirecționa o singură rută.
Publică un server local printr-un tunel cu PROXYSERVER() și PROXYCLIENT()
Lasă un server Total.js cu adresă publică să redirecționeze cereri către un program care rulează doar pe o mașină privată, cu un tunel WebSocket pe care îl deschide partea privată.
Protejează formularele și cererile cu token-uri CSRF
Creează un token cu $.csrf(), trimite-l odată cu cererea și verifică-l într-un middleware pentru a respinge cererile venite de pe alte site-uri.
Grupează acțiunile într-o schemă și refolosește definițiile de input
Folosește NEWSCHEMA() pentru a declara acțiuni înrudite sub un singur nume și partajează o definiție de input între acțiuni cu un fișier din jsonschemas/.
Construiește un pipeline de procesare cu transforms
Înregistrează mai mulți pași sub un singur nume cu NEWTRANSFORM() și trece o valoare prin ei, în ordine, cu TRANSFORM().
Schimbă mesaje cu Total Messaging Service
Activează endpoint-ul WebSocket TMS și lasă clienții externi să primească mesaje publicate, să trimită mesaje aplicației tale și să-i apeleze funcțiile.
Construiește o resursă REST completă cu acțiuni
Declară acțiunile query, read, insert, update, patch și remove peste baza de date NoSQL, cu validare, un 404 pentru înregistrările lipsă și rute care asociază fiecare metodă HTTP.
Configurează o rută WebSocket cu flaguri, autentificare și parametri
Alege tipul mesajelor cu @text sau @binary, cere un utilizator autentificat cu prefixul +, verifică un token CSRF cu @csrf și citește parametrii URL în rutele SOCKET.
Minifică și îmbină CSS, JavaScript și HTML
Fișierele statice și răspunsurile HTML sunt minificate automat; folosește MERGE() pentru a servi mai multe fișiere ca unul singur și setările $minify pentru a-l dezactiva.
Redimensionează și convertește imagini
Procesează imagini cu Image.load(), înlănțuie operații de dimensiune, decupare și format, salvează rezultatul, măsoară-i dimensiunile și servește miniaturi cu $.image().
Verificați limitele schemei numerice în loc de a lua forța completă
Verificați Int, SmallInt, TinyInt și Number2 cu scheme compacte native, inclusiv valori fracționale, intrări zero și off-range.
Folosește helperele încorporate pentru string, number, date și array
Total.js extinde String, Number, Date și Array cu helpere pentru slug-uri, hash-uri, formatare, parsare, grupare și căutare și oferă U.extend() și U.clone() pentru obiecte.
Evenimentele de audit de acțiune cu un audit nativ sink
Observați opțiunea de audit și exprimați apelurile $.audit() fără a contacta un serviciu de înregistrare sau să scrieți intrări sensibile la un jurnal de aplicație.
Rulează în modul debug și în modul release
Opțiunile din Total.run() aleg între modul debug și release; citește modul din DEBUG și limitează rutele la un mod cu @debug și @release.
Testează aplicația cu rulerul de teste încorporat
Scrie un test.js care pornește aplicația, înregistrează teste cu Test.push(), verifică rezultatele cu Test.print() și se încheie cu un cod diferit de zero când unul eșuează.
Utilizați toate core-urile CPU cu modul de cluster
Începeți mai multe procese ale muncitorilor din spatele unui singur port cu opțiunea de cluster a Total.run(), și știți ce este împărtășit între ele și ce nu este.
Încarcă un modul JavaScript de la un URL cu IMPORT()
Descarcă un fișier cu JavaScript de la o adresă, păstrează-l în folderul tmp, încarcă-l cu require și folosește ce exportă; al doilea apel nu îl mai descarcă.
Construiește un flux de componente cu Flow.load() și rulează-l cu exec()
Descrie un FlowStream ca componente și conexiunile dintre ele, încarcă-l în aplicație, trimite un mesaj prin el și citește răspunsul, și schimbă configurația unei componente cât timp rulează.
Testează o componentă Flow separat cu Flow.test()
Încarcă o componentă într-un flux al ei, trimite-i un mesaj din cod și citește ce trimite la ieșirile ei, fără să construiești tot fluxul.
Apelează un program Python care rămâne pornit cu PYPELINE()
Pornește un script Python din aplicație, trimite-i mesaje JSON printr-un socket și primește răspunsurile lui, cu scriptul repornit dacă se oprește.
Limitele de validare a enumelor și a formatului string
Executați controale compacte pozitive și negative pentru enume, Color, Base64, Zip, Icon, JSON și formate IP.
TotalAPI și limitele de serviciu Componentator
Verificați reutilizarea ramurilor TotalAPI și Componentator local fără a face apeluri de serviciu externe.
Operatiunile QueryBuilder, filtrele si contractul de conducere
Inspectați opțiunile native DB și NEWDB, rezultatele curate, erorile și formele de filtrare fără a confunda un constructor cu un driver de date.
Compilați și rulați un component nativ de server
Compilați componentul de încredere Total.js HTML, creați un exemplu, validați mesajele, reconfigură-l și eliberează resursele sale.
Controler apeluri, autorizare manuală și răspunsuri condiționale
Executați jsonstring, răspundeți, efectuați, autorizați, personalizate și ultima modificare a manipulării.
Opțiuni de transport de acțiune și publicarea explicită a TMS
Testarea CSRF, criptarea, compresia și publicarea împotriva HTTP reală și TMS în loc să presupunem că metadata impune comportamentul.
Cache-uri statice de la modul de eliberare invalidate cu Touch
Servează și modifică un fișier statis temporar, șterge reprezentarea sa cache și îndepărtează intrările 404 cache.
RPC, evenimente și conexiuni partajate
Exercitați OPENCLIENT cu o fixare a protocolului local, inclusiv inițializarea, corelația de apel, timout-ul și eliminarea logică-client.
Încărcați fișierele FlowStream și executați lucrătorii izolați
Executați același schemă de încredere FlowStream ca un fir de lucru și un proces copil, încărcați fișierele .flow și eliminați exemplele.
Acțiunea ciclului de viață, extinderea rezultatelor și guvernatorii administratorilor
Exercitați intrarea, ieșirea, extinderea, sa și su cu acțiuni valabile, inadecvate și eșuate.
SQL real cu tranzacțiile native QueryBuilder și SQLite
Înregistrați un driver limitat SQLite, rulați CRUD parametrizat și verificați comisiile, restricționați eșecul și rulează împotriva unei baze de date susținute de fișiere.
Încărcați resursele de aplicație și evitați surprize de pachet de timp
Răspundeți la un proces separat și verificați NPMINSTALL reutilizarea unui pachet deja disponibil fără acces la rețea.
Căutați un director local LDAP
Întreabă o instanță izolată OpenLDAP și verifică rezultatul de legătură în total5 0,019.
Aplicații de pachet ca un pachet Total.js
Creați un pachet local, încărcați definițiile sale prin încărcătorul de start-up și verificați extracția în .src.
Încărcați propriul fișier și creați link-uri de căutare
Verificați în mod implicit încărcarea de curățare, autoclear(false), clar explicit și href întrebare înlocuirea.