Total.js 5 (Backend)
Routen, Actions, Schemas, Datenbanken, WebSocket, Views und alles, was auf dem Server läuft.
Einen JSON-Body mit einer Action validieren
Definiere ein Eingabeschema für eine Action und lass Total.js ungültige Anfragen abweisen, bevor dein Code läuft.
Actions über einen einzigen API-Endpunkt bereitstellen
Deklariere ROUTE('API ...')-Endpunkte, damit ein Client viele Actions per POST {schema, data} über eine einzige URL aufrufen kann.
URL-Parameter in einer Route lesen
Deklariere dynamische Segmente wie {id} in einer Route und lies sie aus $.params.
Viele URLs mit einer Wildcard-Route abfangen
Beende eine Route mit *, um alles unterhalb eines Pfades zu treffen, und behalte spezifische Routen für die Ausnahmen.
Jede HTTP-Methode behandeln
Deklariere Routen für GET, POST, PUT, PATCH und DELETE und lies die Methode aus $.method.
Eine Route mit Flags einschränken
Füge @Flags wie @json, @xml oder @upload hinzu, damit eine Route nur zu den Anfragen passt, für die sie gedacht ist.
Den Query-String und den Request-Body lesen
Nutze $.query für die URL-Parameter und $.body für JSON- oder Formulardaten in einem Route-Handler.
Payload-Größe und Timeout einer Route begrenzen
Hänge <1kb oder <10s an eine Route, um die Größe der Anfrage oder die Zeit des Handlers zu begrenzen.
Typisierte Routenparameter in einer Action deklarieren
Nutze die Option params von NEWACTION, damit Total.js die URL-Parameter validiert, bevor dein Code läuft.
Die Art der Antwort wählen
Sende JSON, HTML, Klartext, XML, Weiterleitungen, leere Antworten oder Binärdaten aus einem Route-Handler.
Header lesen und mit Cookies arbeiten
Lies Request-Header aus $.headers, lies und schreibe Cookies mit $.cookie() und setze Response-Header.
Datei-Uploads empfangen
Akzeptiere multipart/form-data mit dem Flag @upload und lies die hochgeladenen Dateien aus $.files.
Anfragen von anderen Origins mit CORS erlauben
Rufe CORS() auf, damit ein Origin, mehrere Origins oder jeder Origin deine Routen aus einem Browser nutzen darf.
Eine View ohne Handler rendern
Eine Route ohne Handler rendert die nach ihrer URL benannte View oder die View, die du angibst.
Wählen Sie den richtigen Eingangstyp für eine Aktion
Wählen Sie Typen für Eingabe, Parameter, Query und Output-Definitionen, einschließlich Konvertierungen und abgelehntem Wert.
Den Query-String in einer Action validieren
Deklariere query in NEWACTION, um die URL-Parameter zu validieren und umzuwandeln, und lies die bereinigten Werte aus $.query.
Die Antwort einer Action mit output filtern
Deklariere output, damit nur die aufgeführten Felder die Action verlassen, zum Beispiel um nie einen Passwort-Hash preiszugeben.
Einen Benutzer oder eine Berechtigung in einer Action verlangen
Nutze die Optionen user und permissions von NEWACTION, damit die Autorisierung bei der Action liegt und nicht in jeder Route.
Routen mit AUTH schützen
Authentifiziere jede Anfrage mit AUTH() und beschränke Routen mit den Präfixen + und - auf angemeldete oder anonyme Benutzer.
Die Route innerhalb der Action deklarieren
Lege die Route in die Option route von NEWACTION und halte URL, Validierung und Code an einem Ort.
Benutzer mit der eingebauten Session-Authentifizierung anmelden
Übergib AUTH() ein Optionsobjekt, um signierte Session-Cookies, einen Session-Speicher und Logout zu erhalten, ohne die Infrastruktur zu schreiben.
Eine Action aus dem eigenen Code aufrufen
Nutze ACTION(), um eine Action aus einem Timer, einem Job oder einer anderen Action auszuführen, mit eigenem Payload, eigener Query und eigenem Benutzer.
Mehrere Actions in einer Route verketten
Liste mehrere Actions nach --> auf, um sie nacheinander mit demselben Payload auszuführen, und markiere mit (response), welche antwortet.
Eine Middleware zu einer Route hinzufügen
Registriere eine Middleware mit MIDDLEWARE() und hänge sie mit dem Flag #name an Routen.
Einen WebSocket-Chat bauen
Deklariere eine SOCKET-Route, höre auf Nachrichten und sende sie an alle verbundenen Clients.
Von Node aus mit einem WebSocket-Server verbinden
Nutze WEBSOCKETCLIENT, um aus deiner App eine WebSocket-Verbindung zu öffnen, Nachrichten zu senden und auf Antworten zu reagieren.
Code mit Events entkoppeln
Sende und höre Anwendungs-Events mit EMIT(), ON(), ONCE() und OFF(), damit Module sich nicht direkt aufrufen.
Daten mit der eingebauten NoSQL-Datenbank speichern und lesen
Füge Dokumente mit NOSQL() ein und frage sie ab, und stelle sie über Actions bereit, ohne eine Datenbank zu installieren.
Die NoSQL-Datenbank abfragen
Filtere, sortiere, paginiere und projiziere Dokumente mit where, in, between, search, sort, take, skip und fields.
NoSQL-Dokumente aktualisieren und entfernen
Ändere Dokumente mit update() und where(), lösche sie mit remove() und lies, wie viele betroffen waren.
Mit der DATA-API die Datenbank wechseln
DATA adressiert eine Tabelle als Datenbank/Tabelle, sodass derselbe Abfragecode mit dem eingebauten NoSQL und mit anderen Datenbanken funktioniert.
Werte im Speicher zwischenspeichern
Speichere Werte mit CACHE.set() und einer Ablaufzeit, lies sie mit CACHE.get() und lösche sie mit remove() oder reset().
Kleine Einstellungen mit MEMORIZE dauerhaft speichern
Halte ein JSON-Objekt auf der Festplatte, das Neustarts überlebt, für Zähler und Einstellungen, die keine Datenbank brauchen.
Eindeutige IDs und Hashes erzeugen
Erzeuge IDs mit UID() und GUID() und Hashes mit HASH(), und wisse, was du wo einsetzt.
Langsame Ergebnisse mit FILECACHE auf der Festplatte zwischenspeichern
Nutze FILECACHE(), um ein Ergebnis einmal zu berechnen und für eine Zeit aus einer Datei wiederzuverwenden, auch nach einem Neustart.
Hochgeladene Dateien mit FILESTORAGE speichern
Speichere Uploads in einem verwalteten Dateispeicher mit file.fs() und sende sie mit $.filefs() zurück.
Eine View mit einem Layout rendern
Rendere eine HTML-View mit einem Modell, durchlaufe Daten und gib Werte an das Layout weiter.
Bedingungen und Maskierung in Views nutzen
Verzweige mit @{if}, @{else} und @{fi} und wähle zwischen maskierter Ausgabe @{value} und rohem HTML @{!value}.
In Views über Arrays und Objekte iterieren
Wiederhole Markup mit @{foreach} für Arrays und Objekte und nutze den Index des aktuellen Elements.
Views und Assets einbinden
Verwende Markup mit @{view()} wieder und füge Skripte und Stile mit @{import()} hinzu.
Abschnitte des Layouts aus einer View füllen
Deklariere einen Abschnitt in einer View mit @{section} und gib ihn im Layout mit @{section('name')} aus, und wähle pro Anfrage ein anderes Layout.
View-Helper hinzufügen und die Config in Views lesen
Registriere Funktionen in DEF.helpers, um sie aus Views aufzurufen, und lies Config-Werte mit @{'%key'}.
Markdown in HTML umwandeln
Nutze den Prototyp String.markdown(), um Markdown-Text in HTML zu rendern, für Inhalte von Benutzern oder aus Dateien.
Text mit Tangular-Templates rendern
Nutze Tangular.render(), um Templates für E-Mails, Dokumente und Nachrichten mit Bedingungen, Schleifen und Helpern zu füllen.
Templates aus Text, Dateien und URLs mit TEMPLATE rendern
Mit TEMPLATE() renderst du ein Tangular-Template, das ein Text, eine Datei des Templates-Ordners oder eine URL ist, mit eigenen Helpern und einem Standardmodell.
Zwei Listen mit DIFFARR vergleichen: was hinzuzufügen, zu aktualisieren und zu entfernen ist
Mit DIFFARR() vergleichst du die in der Datenbank gespeicherten Einträge mit denen eines Formulars und erhältst die, die hinzugefügt, aktualisiert und entfernt werden müssen.
Query Builder: DB() und NEWDB() mit Ihrem eigenen Datenbank-Driver
Erstellen Sie Fragen mit DB(.find().where(.sort() und lassen Sie einen mit NEWDB() registrierten Fahrer sie ausführen, während ein registrierter Fahrer die Datenbankoperationen unterstützt.
Die App mit der Datei config konfigurieren
Halte Einstellungen in einer Datei config und lies sie über CONF.
Daten mit einem Schlüssel ver- und entschlüsseln
Verwandle Objekte mit ENCRYPT() in undurchsichtige Tokens und lies sie mit DECRYPT() zurück, für signierte Links und kurzlebige Tokens.
Externe Dienste mit API() und den Treibern von NEWAPI() aufrufen
Registriere mit NEWAPI() einen Treiber für einen Dienst und rufe ihn aus Aktionen mit API(name, schema, data) auf, im gleichen Stil von Callback, Fehler und Promise wie der Query Builder.
Sprechen Sie mit Sprachmodellen mit AIMODEL(), NEWAIMODEL() und AIPARSER()
Erstellen Sie eine Chat-Anfrage mit AIMODEL(), lassen Sie sie von einem mit NEWAIMODEL() registrierten Fahrer an einen Anbieter senden und lesen Sie gestreamte Antworten mit AIPARSER().
Fehlversuche mit BLOCKED begrenzen
Zähle Versuche pro IP-Adresse mit BLOCKED() und antworte mit 429, sobald das Limit erreicht ist, für Logins und Passwort-Zurücksetzungen.
Die kleinen globalen Helfer: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY und PROMISIFY
Verwenden Sie Anwendungsglobalen, Datums, tiefe Kopien, Fragebogen und versprechende Helfer.
Fehler mit ErrorBuilder sammeln, mit ERROR() protokollieren und mit AUDIT() eine Audit-Spur führen
Antworte mit mehreren Fehlern auf einmal mit ErrorBuilder, der Antwort SUCCESS(), wie ERROR() Fehlschläge aufzeichnet und wie AUDIT() in eine Logdatei schreibt, wer was getan hat.
Arbeit mit setTimeout2() und clearTimeout2() entprellen
Mit setTimeout2() führst du eine Funktion einmal aus, nachdem die Aufrufe aufgehört haben; der vorherige Timer mit derselben ID wird ersetzt, und mit clearTimeout2() brichst du ihn ab.
An einen Browser gebundene Tokens mit ENCRYPTREQ() und DECRYPTREQ()
Verschlüssle einen Wert zusammen mit dem User-Agent (und optional der IP-Adresse) der Anfrage und lies ihn nur vom selben Client wieder aus.
Einen Ordner mit BACKUP() und RESTORE() sichern und Befehle mit SHELL() ausführen
Packe ein Verzeichnis mit BACKUP() und RESTORE() in eine Datei und entpacke es wieder, und führe mit SHELL() einen Shell-Befehl im Projektordner aus.
Die Anwendung mit PAUSESERVER() in Wartung setzen
Pausiere den Server unter einem Namen, sodass jede Anfrage eine 503-Seite erhält, setze ihn fort und beachte, dass der Aufruf ohne zweites Argument umschaltet.
Geschäftsregeln als Text mit NEWMACRO()
Kompiliere kleine Regeln in einer einfachen Sprache (IF, ELSE, AND, OR, RETURN, Helper-Aufrufe) zu einer Funktion, die du mit einem Modell ausführst, sodass die Regeln in einer Datei oder einer Datenbank leben können.
Statische Dateien aus dem Ordner public ausliefern
Dateien im Verzeichnis public werden automatisch ausgeliefert, ohne dass eine Route nötig ist.
Eine andere Adresse mit AJAX() vom Server aus aufrufen
Mit AJAX() rufst du eine HTTP-Adresse mit einem JSON-Body auf und erhältst die geparste Antwort, als Promise oder mit Callback, und erfährst, was bei Fehlern und XML passiert.
Andere HTTP-APIs mit RESTBuilder aufrufen
Sende GET- und POST-Anfragen an einen anderen Dienst, setze Header und ein Timeout und lies Status und geparste Antwort.
Einen Stream nach seinem Ende mit CLEANUP() freigeben
Mit CLEANUP() zerstörst du einen Stream, sobald er beendet ist oder fehlgeschlagen ist, damit keine Dateihandles offen bleiben, mit Callback oder als Promise.
Eine View in mehrere Sprachen übersetzen
Markiere Texte in Views mit @(...) und liefere Übersetzungen in Ressourcendateien, die LOCALIZE() auswählt.
Code nach Zeitplan mit CRON ausführen
Registriere eine Funktion mit CRON() und einer cron-Zeile aus fünf Feldern und erfahre, wann die Prüfung läuft und wie man einen Job entfernt.
Schwere Arbeit in einem Thread oder Kindprozess ausführen
Nutze NEWTHREAD(), um einen Worker-Thread zu starten, ihm Nachrichten zu senden und die Antworten zu lesen, ohne den Hauptprozess zu blockieren.
Einige Worker-Threads mit NEWTHREADPOOL() teilen
Starte eine feste Anzahl Worker, leihe dir mit pool.exec() einen aus, wenn Arbeit ansteht, gib ihn mit release() zurück und lass die anderen Aufgaben auf einen freien Worker warten.
Andere Server mit REQUEST aufrufen und Dateien mit DOWNLOAD speichern
Nutze REQUEST() für HTTP-Aufrufe auf niedriger Ebene mit voller Kontrolle über Methode, Header, Query und Body und DOWNLOAD(), um eine entfernte Datei auf die Festplatte zu streamen.
Eine E-Mail aus einer View senden
Konfiguriere SMTP in der Datei config, rendere eine View als Nachrichtentext mit MAIL() und sende fertiges HTML mit HTMLMAIL().
Die Seiten 404 und 401 anpassen
Registriere Handler mit ROUTE('#404') und ROUTE('#401'), um die eingebauten Fehlerseiten zu ersetzen, und löse sie selbst mit $.fallback() aus.
Sende dir selbst eine Nachricht mit LOGMAIL()
Sende eine reine Text- oder JSON-Nachricht ohne View an eine Adresse, für Logs und Warnungen, über dieselben SMTP-Einstellungen wie MAIL().
Dateien und Streams an den Client senden
Liefere eine Datei von der Festplatte mit $.file(), erzwinge einen Download-Namen, streame erzeugte Inhalte mit $.stream() und antworte mit 404, wenn die Datei fehlt.
Anfragen an einen anderen Server weiterleiten
Nutze PROXY(), um einem URL-Präfix einen Upstream-Server zuzuordnen, wähle, wie der Pfad kopiert wird, und leite mit $.proxy() eine einzelne Route weiter.
Einen lokalen Server über einen Tunnel mit PROXYSERVER() und PROXYCLIENT() veröffentlichen
Lass einen Total.js-Server mit öffentlicher Adresse Anfragen an ein Programm weiterleiten, das nur auf einem privaten Rechner läuft, über einen WebSocket-Tunnel, den die private Seite öffnet.
Formulare und Anfragen mit CSRF-Tokens schützen
Erzeuge ein Token mit $.csrf(), sende es mit der Anfrage mit und prüfe es in einer Middleware, damit seitenübergreifende Anfragen abgelehnt werden.
Actions in einem Schema gruppieren und Input-Definitionen wiederverwenden
Nutze NEWSCHEMA(), um zusammengehörige Actions unter einem Namen zu deklarieren, und teile eine Input-Definition zwischen Actions mit einer Datei in jsonschemas/.
Eine Verarbeitungspipeline mit Transforms bauen
Registriere mehrere Schritte unter einem Namen mit NEWTRANSFORM() und lasse einen Wert mit TRANSFORM() der Reihe nach durch sie laufen.
Nachrichten mit dem Total Messaging Service austauschen
Aktiviere den TMS-WebSocket-Endpunkt und lasse externe Clients veröffentlichte Nachrichten empfangen, Nachrichten an deine App senden und ihre Funktionen aufrufen.
Eine vollständige REST-Ressource mit Actions bauen
Deklariere die Actions query, read, insert, update, patch und remove über die NoSQL-Datenbank, mit Validierung, einem 404 für fehlende Datensätze und Routen, die jede HTTP-Methode zuordnen.
Eine WebSocket-Route mit Flags, Authentifizierung und Parametern konfigurieren
Wähle den Nachrichtentyp mit @text oder @binary, verlange mit dem Präfix + einen angemeldeten Benutzer, prüfe ein CSRF-Token mit @csrf und lies URL-Parameter in SOCKET-Routen.
CSS, JavaScript und HTML minifizieren und zusammenführen
Statische Dateien und HTML-Antworten werden automatisch minifiziert; nutze MERGE(), um mehrere Dateien als eine auszuliefern, und die $minify-Einstellungen, um es abzuschalten.
Bilder skalieren und konvertieren
Verarbeite Bilder mit Image.load(), verkette Operationen für Größe, Zuschnitt und Format, speichere das Ergebnis, miss seine Größe und liefere Vorschaubilder mit $.image().
Überprüfen Sie die Zahlengrenze anstatt eine vollständige Zwang zu ergreifen
Check Int, SmallInt, TinyInt und Number2 mit nativen Compaktschematen, einschließlich Fraktionswerte, Null- und Out-of-Range-Einträge.
Die eingebauten Helfer für String, Number, Date und Array nutzen
Total.js erweitert String, Number, Date und Array um Helfer für Slugs, Hashes, Formatierung, Parsing, Gruppierung und Suche und bietet U.extend() und U.clone() für Objekte.
Zeichnen Sie Aktionsüberwachungsereignisse mit einer nativen Überwachungssenke auf
Beobachten Sie die Audit-Option und explizite $.audit()-Aufrufe, ohne einen Protokollierungsdienst zu kontaktieren oder vertrauliche Eingaben in ein Anwendungsprotokoll zu schreiben.
Im Debug- und im Release-Modus ausführen
Die Optionen von Total.run() wählen zwischen Debug- und Release-Modus; lies den Modus aus DEBUG und beschränke Routen mit @debug und @release auf einen Modus.
Die Anwendung mit dem eingebauten Test-Runner testen
Schreibe eine test.js, die die App startet, Tests mit Test.push() registriert, Ergebnisse mit Test.print() prüft und mit einem Code ungleich null endet, wenn einer fehlschlägt.
Verwenden Sie alle CPU-Kore mit dem Clustermodus
Beginnen Sie mehrere Arbeiterprozesse hinter einem Port mit der Clusteroption von Total.run(), und wissen Sie, was zwischen ihnen geteilt wird und was nicht ist.
Ein JavaScript-Modul mit IMPORT() von einer URL laden
Lade eine JavaScript-Datei von einer Adresse herunter, lege sie im tmp-Ordner ab, binde sie mit require ein und nutze, was sie exportiert; der zweite Aufruf lädt sie nicht erneut herunter.
Einen Fluss aus Komponenten mit Flow.load() bauen und mit exec() ausführen
Beschreibe einen FlowStream als Komponenten und die Verbindungen zwischen ihnen, lade ihn in die Anwendung, sende eine Nachricht hindurch und lies die Antwort, und ändere die Konfiguration einer Komponente während sie läuft.
Eine Flow-Komponente allein mit Flow.test() testen
Lade eine Komponente in einen eigenen Fluss, sende ihr aus dem Code eine Nachricht und lies, was sie an ihre Ausgänge sendet, ohne den ganzen Fluss zu bauen.
Ein weiterlaufendes Python-Programm mit PYPELINE() aufrufen
Starte ein Python-Skript aus der Anwendung, sende ihm JSON-Nachrichten über einen Socket und empfange seine Antworten, wobei das Skript neu gestartet wird, wenn es stirbt.
Enums und String-Format Validierung Grenzen
Führen Sie positive und negative Compakt-Schema-Checks für Enums, Color, Base64, Zip, Icon, JSON und IP-Formate.
TotalAPI und Componentator Service Grenzen
Überprüfen Sie die gesperrte TotalAPI-Filiale und Componentator lokalen Cache ohne externe Serviceanrufe.
QueryBuilder-Betrieb, Filter und Fahrervertrag
Überprüfen Sie die Optionen der nativen DB und NEWDB, die Ergebnisse, Fehler und Filterformen ohne einen Bauherrer mit einem Datenbank-Driver zu verwechseln.
Kompilieren und laufen Sie eine native Server-Komponente
Compile vertrauenswürdige Total.js-Komponenten HTML, erstellen Sie ein Beispiel, validieren Sie Nachrichten, konfigurieren Sie es und veröffentlichen Sie seine Ressourcen.
Controller Callbacks, manuelle Genehmigung und bedingte Antworten
JSONSTRING durchführen, reagieren, erfolgreiche, autorisieren, benutzerdefinierte und letzte Änderung.
Aktionstransportoptionen und explicit TMS-Veröffentlichung
Test csrf, verschlüsselt, komprimiert und veröffentlicht gegen echte HTTP und TMS anstelle von der Annahme, dass Metadaten Verhalten verpflichtet.
Invalidierung von Release-Modus statische Cache mit Touch
Servieren und modifizieren Sie eine vorübergehende statische Datei, löschen Sie ihre cached-Dienstleistung und entfernen Sie cached 404-Einträge.
OPENCLIENT RPC, Veranstaltungen und gemeinsame Verbindungen
Üben Sie OPENCLIENT mit einer lokalen Protokoll-Fixur, einschließlich Initialisierung, Callback-Korrelation, Timout und Logical-Client-Einstellung.
Laden Sie FlowStream-Dateien und führen Sie isolierte Arbeiter aus
Führen Sie das gleiche vertrauenswürdige FlowStream-Schema wie ein Arbeiterstrahl und ein Kindprozess, laden Sie .flow-Dateien und entfernen Sie Beispiele.
Action-Lebenszyklus, Ergebnisverlängerung und Administrator Guards
Üben Sie Oninput, Onoutput, Extend, Sa und Su mit gültigen, invalid und fehlenden Aktionen.
Real SQL mit native QueryBuilder und SQLite Transaktionen
Registrieren Sie einen begrenzten SQLite-Driver, führen Sie die parameterisierte CRUD und verifizieren Sie die Verpflichtung, beschränken Sie den Fehler und rollback gegen eine Datei unterstützte Datenbank.
Laden Sie die Anwendungsressourcen und vermeiden Sie Runtime-Paket Überraschungen
Laden Sie LOAD in einem separaten Prozess durch und überprüfen Sie NPMINSTALL erneut einen bereits verfügbaren Paket ohne Netzwerkzugang.
Fragen Sie ein echtes lokales LDAP-Verzeichnis ab
Fragen Sie eine isolierte OpenLDAP-Instanz ab und überprüfen Sie das Bindungsergebnis insgesamt5 0.0.19.
Packungsanwendungsdateien als Total.js-Package
Erstellen Sie einen lokalen Paket, laden Sie seine Definitionen über den Start-up-Ladern herunter und verifizieren Sie die Extraction in .src.
Eigene Bereinigung hochgeladener Dateien und Erstellen von Abfragelinks
Überprüfen Sie die Standard-Upload-Bereinigung, die automatische Löschung (falsch), die explizite Löschung und die Ersetzung der Href-Abfrage.