Total.js 5 (backend)
Routes, actions, schémas, bases de données, WebSocket, vues et tout ce qui s’exécute sur le serveur.
Valider un body JSON avec une action
Définissez un schéma d'entrée sur une action et laissez Total.js rejeter les requêtes invalides avant l'exécution de votre code.
Exposer des actions via un seul endpoint API
Déclarez des endpoints ROUTE('API ...') pour qu'un client appelle de nombreuses actions avec POST {schema, data} sur une seule URL.
Lire les paramètres d'URL dans une route
Déclarez des segments dynamiques comme {id} dans une route et lisez-les depuis $.params.
Capter de nombreuses URL avec une route générique
Terminez une route par * pour correspondre à tout ce qui se trouve sous un chemin, et gardez des routes spécifiques pour les exceptions.
Gérer chaque méthode HTTP
Déclarez des routes pour GET, POST, PUT, PATCH et DELETE et lisez la méthode depuis $.method.
Restreindre une route avec des flags
Ajoutez des @flags comme @json, @xml ou @upload pour qu'une route ne corresponde qu'aux requêtes auxquelles elle est destinée.
Lire la query string et le body de la requête
Utilisez $.query pour les paramètres de l'URL et $.body pour les données JSON ou de formulaire dans un gestionnaire de route.
Limiter la taille du payload et le timeout d'une route
Ajoutez <1kb ou <10s à une route pour plafonner la taille de la requête ou le temps dont le gestionnaire dispose.
Déclarer des paramètres de route typés dans une action
Utilisez l'option params de NEWACTION pour que Total.js valide les paramètres de l'URL avant l'exécution de votre code.
Choisir comment répondre
Envoyez du JSON, du HTML, du texte brut, du XML, des redirections, des réponses vides ou des données binaires depuis un gestionnaire de route.
Lire les en-têtes et travailler avec les cookies
Lisez les en-têtes de la requête depuis $.headers, lisez et écrivez des cookies avec $.cookie() et définissez des en-têtes de réponse.
Recevoir des téléversements de fichiers
Acceptez multipart/form-data avec le flag @upload et lisez les fichiers téléversés depuis $.files.
Autoriser les requêtes cross-origin avec CORS
Appelez CORS() pour autoriser une origine, plusieurs origines ou toutes les origines à utiliser vos routes depuis un navigateur.
Rendre une vue sans écrire de gestionnaire
Une route sans gestionnaire rend la vue nommée d'après son URL, ou la vue que vous indiquez.
Choisissez le type d'entrée approprié pour une action
Choisissez les types d'entrée, de paramètres, des définitions de quête et de sortie, y compris les conversions et les valeurs rejetées.
Valider la query string dans une action
Déclarez query dans NEWACTION pour valider et convertir les paramètres de l'URL, et lisez les valeurs nettoyées depuis $.query.
Filtrer la réponse d'une action avec output
Déclarez output pour que seuls les champs listés quittent l'action, par exemple pour ne jamais divulguer un hash de mot de passe.
Exiger un utilisateur ou une permission dans une action
Utilisez les options user et permissions de NEWACTION pour que l'autorisation vive à côté de l'action, et non dans chaque route.
Protéger des routes avec AUTH
Authentifiez chaque requête avec AUTH() et limitez les routes aux utilisateurs connectés ou anonymes avec les préfixes + et -.
Déclarer la route à l'intérieur de l'action
Placez la route dans l'option route de NEWACTION et gardez l'URL, la validation et le code au même endroit.
Connecter des utilisateurs avec l'authentification par session intégrée
Passez un objet d'options à AUTH() pour obtenir des cookies de session signés, un magasin de sessions et la déconnexion sans écrire la plomberie.
Appeler une action depuis votre propre code
Utilisez ACTION() pour exécuter une action depuis un minuteur, une tâche ou une autre action, avec son propre payload, sa query et son utilisateur.
Enchaîner plusieurs actions dans une route
Listez plusieurs actions après --> pour les exécuter à la suite sur le même payload et indiquez laquelle répond avec (response).
Ajouter un middleware à une route
Enregistrez un middleware avec MIDDLEWARE() et attachez-le aux routes avec le flag #name.
Construire un chat WebSocket
Déclarez une route SOCKET, écoutez les messages et diffusez-les à tous les clients connectés.
Se connecter à un serveur WebSocket depuis Node
Utilisez WEBSOCKETCLIENT pour ouvrir une connexion WebSocket depuis votre application, envoyer des messages et réagir aux réponses.
Découpler votre code avec des événements
Émettez et écoutez des événements d'application avec EMIT(), ON(), ONCE() et OFF() pour que les modules ne s'appellent pas directement.
Stocker et lire des données avec la base NoSQL intégrée
Insérez et interrogez des documents avec NOSQL() et exposez-les via des actions, sans installer de base de données.
Interroger la base de données NoSQL
Filtrez, triez, paginez et projetez des documents avec where, in, between, search, sort, take, skip et fields.
Mettre à jour et supprimer des documents NoSQL
Modifiez des documents avec update() et where(), supprimez-les avec remove() et lisez combien ont été touchés.
Utiliser l'API DATA pour changer de base de données
DATA adresse une table sous la forme base/table, si bien que le même code de requêtes fonctionne avec le NoSQL intégré et avec d'autres bases.
Mettre des valeurs en cache en mémoire
Stockez des valeurs avec CACHE.set() et une expiration, lisez-les avec CACHE.get() et effacez-les avec remove() ou reset().
Conserver de petits réglages avec MEMORIZE
Gardez sur disque un objet JSON qui survit aux redémarrages, pour des compteurs et des réglages qui n'ont pas besoin d'une base de données.
Générer des ids uniques et des hashes
Créez des ids avec UID() et GUID(), et des hashes avec HASH(), et sachez lequel utiliser où.
Mettre en cache des résultats lents sur disque avec FILECACHE
Utilisez FILECACHE() pour calculer un résultat une fois et le réutiliser depuis un fichier pendant une période, même après un redémarrage.
Stocker les fichiers téléversés avec FILESTORAGE
Enregistrez les téléversements dans un stockage de fichiers géré avec file.fs() et renvoyez-les avec $.filefs().
Rendre une vue avec un layout
Rendez une vue HTML avec un modèle, parcourez des données et transmettez des valeurs au layout.
Utiliser les conditions et l'échappement dans les vues
Ramifiez avec @{if}, @{else} et @{fi}, et choisissez entre la sortie échappée @{value} et le HTML brut @{!value}.
Parcourir des tableaux et des objets dans les vues
Répétez du balisage avec @{foreach} pour des tableaux et des objets, et utilisez l'index de l'élément courant.
Inclure des vues et des ressources
Réutilisez du balisage avec @{view()} et ajoutez des scripts et des styles avec @{import()}.
Remplir des sections du layout depuis une vue
Déclarez une section dans une vue avec @{section} et affichez-la dans le layout avec @{section('name')}, et choisissez un autre layout par requête.
Ajouter des helpers de vue et lire la config dans les vues
Enregistrez des fonctions dans DEF.helpers pour les appeler depuis les vues, et lisez les valeurs de config avec @{'%key'}.
Convertir du Markdown en HTML
Utilisez le prototype String.markdown() pour rendre du texte Markdown en HTML, pour du contenu saisi par des utilisateurs ou stocké dans des fichiers.
Générer du texte avec des templates Tangular
Utilisez Tangular.render() pour remplir des modèles d'e-mails, de documents et de messages avec des conditions, des boucles et des helpers.
Rendre des templates depuis du texte, des fichiers et des URL avec TEMPLATE
Utilisez TEMPLATE() pour rendre un template Tangular qui est un texte, un fichier du dossier des templates ou une URL, avec ses propres helpers et un modèle par défaut.
Comparer deux listes avec DIFFARR : quoi ajouter, mettre à jour et supprimer
Utilisez DIFFARR() pour comparer les éléments enregistrés en base de données avec ceux d'un formulaire et obtenir ceux à ajouter, à mettre à jour et à supprimer.
Query Builder : DB() et NEWDB() avec votre propre pilote de données
Construisez des requêtes avec DB().find().where().sort() et laissez un conducteur enregistré avec NEWDB() les exécuter, tandis qu'un conducteur inscrit implémenter supporté les opérations de base de données.
Configurer l'application avec le fichier config
Gardez les réglages dans un fichier config et lisez-les via CONF.
Chiffrer et déchiffrer des données avec une clé
Transformez des objets en jetons opaques avec ENCRYPT() et relisez-les avec DECRYPT(), pour des liens signés et des jetons de courte durée.
Appeler des services externes avec API() et les pilotes de NEWAPI()
Enregistrez un pilote pour un service avec NEWAPI() et appelez-le depuis les actions avec API(name, schema, data), avec le même style de callback, d'erreur et de promesse que le query builder.
Parlez aux modèles de langage avec AIMODEL(), NEWAIMODEL() et AIPARSER()
Créez une demande de discussion avec AIMODEL(), laissez un pilote enregistré avec NEWAIMODEL() l'envoyer à un fournisseur et lisez les réponses en streaming avec AIPARSER().
Limiter les tentatives échouées avec BLOCKED
Comptez les tentatives par adresse IP avec BLOCKED() et répondez 429 une fois la limite atteinte, pour les connexions et les réinitialisations de mot de passe.
Les petits assistants mondiaux : MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY et PROMISIFY
Utilisez les globaux d'application, les dates, les copies profondes, les lignes de requête et les assistants promis.
Collecter des erreurs avec ErrorBuilder, les journaliser avec ERROR() et tenir une piste d'audit avec AUDIT()
Répondez avec plusieurs erreurs à la fois grâce à ErrorBuilder, la réponse SUCCESS(), la façon dont ERROR() enregistre les échecs et dont AUDIT() ajoute à un fichier journal qui a fait quoi.
Temporiser un travail avec setTimeout2() et clearTimeout2()
Utilisez setTimeout2() pour exécuter une fonction une seule fois quand les appels cessent, en remplaçant le minuteur précédent de même identifiant, et annulez-le avec clearTimeout2().
Jetons liés à un navigateur avec ENCRYPTREQ() et DECRYPTREQ()
Chiffrez une valeur avec le user agent (et éventuellement l'adresse IP) de la requête et ne la relisez que depuis le même client.
Sauvegarder un dossier avec BACKUP() et RESTORE(), et exécuter des commandes avec SHELL()
Regroupez un répertoire dans un seul fichier et dépaquetez-le à nouveau avec BACKUP() et RESTORE(), et exécutez une commande du shell dans le dossier du projet avec SHELL().
Mettre l'application en maintenance avec PAUSESERVER()
Mettez le serveur en pause par nom pour que chaque requête reçoive une page 503, reprenez-le et sachez que sans second argument l'appel bascule l'état.
Des règles métier sous forme de texte avec NEWMACRO()
Compilez de petites règles écrites dans un langage simple (IF, ELSE, AND, OR, RETURN, appels de helpers) en une fonction que vous exécutez avec un modèle, afin que les règles puissent vivre dans un fichier ou une base de données.
Servir des fichiers statiques depuis le dossier public
Les fichiers du répertoire public sont servis automatiquement, sans route.
Appeler une autre adresse avec AJAX() depuis le serveur
Utilisez AJAX() pour appeler une adresse HTTP avec un corps JSON et obtenir la réponse analysée, sous forme de promesse ou avec un callback, et sachez ce qui se passe avec les erreurs et le XML.
Appeler d'autres API HTTP avec RESTBuilder
Faites des requêtes GET et POST vers un autre service, définissez des en-têtes et un timeout, et lisez le statut et la réponse analysée.
Libérer un flux à sa fin avec CLEANUP()
Utilisez CLEANUP() pour détruire un flux dès qu'il est terminé ou a échoué, afin de ne pas laisser de descripteurs de fichier ouverts, avec un callback ou sous forme de promesse.
Traduire une vue en plusieurs langues
Marquez les textes avec @(...) dans les vues et fournissez les traductions dans des fichiers de ressources choisis par LOCALIZE().
Exécuter du code selon un calendrier avec CRON
Enregistrez une fonction avec CRON() et une ligne cron à cinq champs, et sachez quand la vérification s'exécute et comment supprimer une tâche.
Exécuter un travail lourd dans un thread ou un processus enfant
Utilisez NEWTHREAD() pour démarrer un thread worker, lui envoyer des messages et lire ses réponses sans bloquer le processus principal.
Partager quelques threads de travail avec NEWTHREADPOOL()
Démarrez un nombre fixe de workers, empruntez-en un avec pool.exec() quand il y a du travail, rendez-le avec release() et laissez les autres tâches attendre un worker libre.
Appeler d'autres serveurs avec REQUEST et enregistrer des fichiers avec DOWNLOAD
Utilisez REQUEST() pour des appels HTTP de bas niveau avec un contrôle total de la méthode, des en-têtes, de la query et du corps, et DOWNLOAD() pour transférer un fichier distant sur le disque.
Envoyer un e-mail à partir d'une vue
Configurez SMTP dans le fichier config, rendez une vue comme corps du message avec MAIL(), et envoyez du HTML déjà prêt avec HTMLMAIL().
Personnaliser les pages 404 et 401
Enregistrez des gestionnaires ROUTE('#404') et ROUTE('#401') pour remplacer les pages d'erreur intégrées, et déclenchez-les vous-même avec $.fallback().
Envoyez-vous un message avec LOGMAIL()
Envoyez un message en texte brut ou en JSON à une adresse sans vue, pour les journaux et les alertes, avec les mêmes réglages SMTP que MAIL().
Envoyer des fichiers et des flux au client
Servez un fichier du disque avec $.file(), imposez un nom de téléchargement, diffusez du contenu généré avec $.stream() et répondez 404 quand le fichier est absent.
Transférer des requêtes vers un autre serveur
Utilisez PROXY() pour associer un préfixe d'URL à un serveur en amont, choisissez comment le chemin est copié, et $.proxy() pour transférer une seule route.
Publier un serveur local par un tunnel avec PROXYSERVER() et PROXYCLIENT()
Laissez un serveur Total.js à adresse publique transmettre des requêtes à un programme qui ne tourne que sur une machine privée, grâce à un tunnel WebSocket que le côté privé ouvre.
Protéger les formulaires et les requêtes avec des jetons CSRF
Créez un jeton avec $.csrf(), envoyez-le avec la requête et vérifiez-le dans un middleware pour rejeter les requêtes provenant d'autres sites.
Regrouper des actions dans un schéma et réutiliser des définitions d'input
Utilisez NEWSCHEMA() pour déclarer des actions liées sous un même nom, et partagez une définition d'input entre actions avec un fichier dans jsonschemas/.
Construire un pipeline de traitement avec des transforms
Enregistrez plusieurs étapes sous un même nom avec NEWTRANSFORM() et faites passer une valeur par elles dans l'ordre avec TRANSFORM().
Échanger des messages avec le Total Messaging Service
Activez le point d'accès WebSocket de TMS et laissez des clients externes recevoir des messages publiés, envoyer des messages à votre application et appeler ses fonctions.
Construire une ressource REST complète avec des actions
Déclarez les actions query, read, insert, update, patch et remove sur la base NoSQL, avec validation, un 404 pour les enregistrements manquants et des routes qui associent chaque méthode HTTP.
Configurer une route WebSocket avec des flags, l'authentification et des paramètres
Choisissez le type de message avec @text ou @binary, exigez un utilisateur connecté avec le préfixe +, vérifiez un jeton CSRF avec @csrf et lisez les paramètres de l'URL dans les routes SOCKET.
Minifier et fusionner CSS, JavaScript et HTML
Les fichiers statiques et les réponses HTML sont minifiés automatiquement ; utilisez MERGE() pour servir plusieurs fichiers comme un seul et les réglages $minify pour le désactiver.
Redimensionner et convertir des images
Traitez des images avec Image.load(), enchaînez les opérations de taille, de recadrage et de format, enregistrez le résultat, mesurez sa taille et servez des vignettes avec $.image().
Vérifier les limites numériques au lieu d'assumer la coercition intégrale
Vérifiez Int, SmallInt, TinyInt et Number2 avec des schémas compacts indigènes, y compris les valeurs fractionnelles, les entrées zéro et hors rang.
Utiliser les helpers intégrés pour string, number, date et array
Total.js étend String, Number, Date et Array avec des helpers pour les slugs, les hachages, le formatage, l'analyse, le regroupement et la recherche, et offre U.extend() et U.clone() pour les objets.
Enregistrez les événements d’audit d’action avec un récepteur d’audit natif
Observez l'option d'audit et les appels explicites $.audit() sans contacter un service de journalisation ni écrire d'entrée sensible dans un journal d'application.
Exécuter en mode debug et en mode release
Les options de Total.run() choisissent entre le mode debug et le mode release ; lisez le mode avec DEBUG et limitez des routes à un mode avec @debug et @release.
Tester l'application avec le lanceur de tests intégré
Écrivez un test.js qui démarre l'application, enregistre des tests avec Test.push(), vérifie les résultats avec Test.print() et se termine avec un code non nul quand l'un échoue.
Utilisez tous les cœurs CPU avec le mode cluster
Commencez plusieurs processus travaillants derrière un port avec l'option de cluster de Total.run(), et sachez ce qui est partagé entre eux et ce qui n'est pas.
Charger un module JavaScript depuis une URL avec IMPORT()
Téléchargez un fichier JavaScript depuis une adresse, gardez-le dans le dossier tmp, chargez-le avec require et utilisez ce qu'il exporte ; le second appel ne le télécharge pas de nouveau.
Construire un flux de composants avec Flow.load() et l'exécuter avec exec()
Décrivez un FlowStream comme des composants et les connexions entre eux, chargez-le dans l'application, envoyez-y un message et lisez la réponse, et changez la configuration d'un composant pendant qu'il tourne.
Tester un composant Flow seul avec Flow.test()
Chargez un composant dans un flux à lui, envoyez-lui un message depuis le code et lisez ce qu'il envoie à ses sorties, sans construire le flux entier.
Appeler un programme Python qui reste en marche avec PYPELINE()
Démarrez un script Python depuis l'application, envoyez-lui des messages JSON par un socket et recevez ses réponses, le script étant relancé s'il meurt.
Enums et limites de validation en format
Exécuter des contrôles de schéma compact positifs et négatifs pour les enums, Color, Base64, Zip, Icon, JSON et IP.
TotalAPI et limites de service Componentator
Vérifiez la branche TotalAPI désactivée et le réutilisation de la caisse locale Componentator sans faire des appels de service externes.
Les opérations de QueryBuilder, les filtres et le contrat de conducteur
Inspectez les options DB et NEWDB, les résultats quoudés, les erreurs et les formes de filtre sans confondre un constructeur avec un pilote de données.
Composer et exécuter un composant de serveur
Compilez le composant HTML de confiance Total.js, créez un exemple, validez les messages, reconfigurez-le et libérez ses ressources.
Les appels de contrôleurs, l'autorisation manuelle et les réponses conditionnelles
Exécutez jsonstring, réagissez, faites, réussissez, autorisez, personnalisez et modifiez le traitement.
Options de transport d'action et publication explicite TMS
Tester CSRF, chiffrer, compresser et publier contre HTTP réel et TMS plutôt que d'assumer les metadata impose le comportement.
Invalidation des cache statiques de mode de libération avec TOUCH
Servir et modifier un fichier statique temporaire, nettoyer sa représentation cachée et supprimer les entrées 404 cachées.
RPC ouvert, événements et connexions partagées
Exercer OPENCLIENT avec une fixation de protocole locale, y compris l'initialisation, la corrélation de la demande, le timout et la suppression logique-client.
Remplir les fichiers FlowStream et exécuter des travailleurs isolés
Exécuter le même schéma de confiance FlowStream comme un filet travailleur et un processus enfant, charger les fichiers .flow et supprimer les exemples.
Le cycle de vie d'action, l'extension du résultat et les gardes administrateurs
Exercer l'entrée, la sortie, l'extension, le sa et le su avec des actions valides, inexistantes et échouées.
SQL réel avec des transactions natives de QueryBuilder et SQLite
Enregistrez un pilote SQLite limité, exécutez le CRUD paramétrifié et vérifiez les engagements, limitez l'échec et ralliez-vous contre une base de données soutenue par des fichiers.
Remplissez les ressources d'application et évitez les surprises du pack de runtime
Exécutez la charge dans un processus séparé et vérifiez NPMINSTALL réutiliser un paquet déjà disponible sans accès au réseau.
Interroger un véritable annuaire LDAP local
Interrogez une instance OpenLDAP isolée et vérifiez le résultat de la liaison dans total5 0.0.19.
Fichiers d'application en tant que paquet Total.js
Créer un paquet local, charger ses définitions à travers le chargement de démarrage du cadre et vérifier l'extraction dans .src.
Propre nettoyage des fichiers téléchargés et création de liens de requête
Vérifiez le nettoyage de téléchargement par défaut, l'effacement automatique (faux), l'effacement explicite et le remplacement des requêtes href.