Total.js 5 (backend)
Rutas, acciones, esquemas, bases de datos, WebSocket, vistas y todo lo que se ejecuta en el servidor.
Valida un body JSON con una acción
Define un esquema de entrada en una acción y deja que Total.js rechace las peticiones inválidas antes de ejecutar tu código.
Expón acciones a través de un único endpoint API
Declara endpoints ROUTE('API ...') para que un cliente llame a muchas acciones con POST {schema, data} en una sola URL.
Lee parámetros de la URL en una ruta
Declara segmentos dinámicos como {id} en una ruta y léelos desde $.params.
Captura muchas URL con una ruta comodín
Termina una ruta con * para coincidir con todo lo que hay debajo de una ruta y mantén rutas específicas para las excepciones.
Gestiona cada método HTTP
Declara rutas para GET, POST, PUT, PATCH y DELETE y lee el método desde $.method.
Restringe una ruta con flags
Añade @flags como @json, @xml o @upload para que una ruta solo coincida con las peticiones a las que está destinada.
Lee la query string y el body de la petición
Usa $.query para los parámetros de la URL y $.body para datos JSON o de formulario en un manejador de ruta.
Limita el tamaño del payload y el timeout de una ruta
Añade <1kb o <10s a una ruta para limitar el tamaño de la petición o el tiempo que puede tardar el manejador.
Declara parámetros de ruta con tipo en una acción
Usa la opción params de NEWACTION para que Total.js valide los parámetros de la URL antes de ejecutar tu código.
Elige cómo responder
Envía JSON, HTML, texto plano, XML, redirecciones, respuestas vacías o datos binarios desde un manejador de ruta.
Lee cabeceras y trabaja con cookies
Lee las cabeceras de la petición desde $.headers, lee y escribe cookies con $.cookie() y define cabeceras de respuesta.
Recibe subidas de ficheros
Acepta multipart/form-data con el flag @upload y lee los ficheros subidos desde $.files.
Permite peticiones entre orígenes con CORS
Llama a CORS() para permitir que un origen, varios o todos usen tus rutas desde un navegador.
Renderiza una vista sin escribir un manejador
Una ruta sin manejador renderiza la vista que lleva el nombre de su URL, o la vista que le indiques.
Seleccione el tipo de entrada correcto para una acción
Seleccione los tipos de entrada, parámetros, cuestionarios y definiciones de salida, incluyendo conversiones y valores rechazados.
Valida la query string en una acción
Declara query en NEWACTION para validar y convertir los parámetros de la URL, y lee los valores limpios desde $.query.
Filtra la respuesta de una acción con output
Declara output para que solo salgan de la acción los campos indicados, por ejemplo para no filtrar nunca el hash de una contraseña.
Exige un usuario o un permiso en una acción
Usa las opciones user y permissions de NEWACTION para que la autorización viva junto a la acción y no en cada ruta.
Protege rutas con AUTH
Autentica cada petición con AUTH() y limita las rutas a usuarios identificados o anónimos con los prefijos + y -.
Declara la ruta dentro de la acción
Pon la ruta en la opción route de NEWACTION y mantén la URL, la validación y el código en un solo lugar.
Inicia sesión con la autenticación por sesión integrada
Pasa un objeto de opciones a AUTH() para obtener cookies de sesión firmadas, un almacén de sesiones y logout sin escribir la infraestructura.
Llama a una acción desde tu propio código
Usa ACTION() para ejecutar una acción desde un temporizador, un trabajo u otra acción, con su propio payload, query y usuario.
Encadena varias acciones en una ruta
Enumera varias acciones después de --> para ejecutarlas en orden con el mismo payload y marca cuál responde con (response).
Añade un middleware a una ruta
Registra un middleware con MIDDLEWARE() y asócialo a las rutas con la marca #nombre.
Crea un chat con WebSocket
Declara una ruta SOCKET, escucha los mensajes y retransmítelos a todos los clientes conectados.
Conéctate a un servidor WebSocket desde Node
Usa WEBSOCKETCLIENT para abrir una conexión WebSocket desde tu app, enviar mensajes y reaccionar a las respuestas.
Desacopla tu código con eventos
Emite y escucha eventos de la aplicación con EMIT(), ON(), ONCE() y OFF() para que los módulos no se llamen directamente.
Guarda y lee datos con la base NoSQL integrada
Inserta y consulta documentos con NOSQL() y expónlos mediante acciones, sin instalar ninguna base de datos.
Consulta la base de datos NoSQL
Filtra, ordena, pagina y proyecta documentos con where, in, between, search, sort, take, skip y fields.
Actualiza y elimina documentos NoSQL
Cambia documentos con update() y where(), bórralos con remove() y lee cuántos se vieron afectados.
Usa la API DATA para cambiar de base de datos
DATA direcciona una tabla como base/tabla, de modo que el mismo código de consultas funciona con el NoSQL integrado y con otras bases de datos.
Cachea valores en memoria
Guarda valores con CACHE.set() y una caducidad, léelos con CACHE.get() y bórralos con remove() o reset().
Persiste pequeños ajustes con MEMORIZE
Mantén en disco un objeto JSON que sobrevive a los reinicios, para contadores y ajustes que no necesitan una base de datos.
Genera ids únicos y hashes
Crea ids con UID() y GUID(), y hashes con HASH(), y sabe cuál usar en cada caso.
Cachea resultados lentos en disco con FILECACHE
Usa FILECACHE() para calcular un resultado una vez y reutilizarlo desde un fichero durante un periodo, incluso tras un reinicio.
Guarda ficheros subidos con FILESTORAGE
Guarda las subidas en un almacén de ficheros gestionado con file.fs() y devuélvelas con $.filefs().
Renderiza una vista con un layout
Renderiza una vista HTML con un modelo, recorre datos y pasa valores al layout.
Usa condiciones y escapado en las vistas
Ramifica con @{if}, @{else} y @{fi}, y elige entre la salida escapada @{value} y HTML sin procesar @{!value}.
Recorre arrays y objetos en las vistas
Repite marcado con @{foreach} para arrays y objetos y usa el índice del elemento actual.
Incluye vistas y recursos
Reutiliza marcado con @{view()} y añade scripts y estilos con @{import()}.
Rellena secciones del layout desde una vista
Declara una sección en una vista con @{section} e imprímela en el layout con @{section('name')}, y elige otro layout por petición.
Añade helpers a las vistas y lee la config desde ellas
Registra funciones en DEF.helpers para llamarlas desde las vistas y lee valores de config con @{'%key'}.
Convierte Markdown a HTML
Usa el prototipo String.markdown() para convertir texto Markdown en HTML, para contenido guardado por usuarios o en ficheros.
Genera texto con plantillas Tangular
Usa Tangular.render() para rellenar plantillas de e-mails, documentos y mensajes con condiciones, bucles y helpers.
Renderiza plantillas desde texto, archivos y URLs con TEMPLATE
Usa TEMPLATE() para renderizar una plantilla Tangular que es un texto, un archivo de la carpeta de plantillas o una URL, con sus propios helpers y un modelo por defecto.
Compara dos listas con DIFFARR: qué añadir, actualizar y eliminar
Usa DIFFARR() para comparar los elementos guardados en la base de datos con los de un formulario y obtener los que hay que añadir, actualizar y eliminar.
Query Builder: DB() y NEWDB() con su propio driver de datos
Construye consultas con DB().find().where().sort() y deje que un conductor registrado con NEWDB() las ejecute, mientras que una conductora registrada implementa operaciones de base de datos.
Configura la app con el fichero config
Guarda los ajustes en un fichero config y léelos con CONF.
Cifra y descifra datos con una clave
Convierte objetos en tokens opacos con ENCRYPT() y léelos con DECRYPT(), para enlaces firmados y tokens de corta duración.
Llama a servicios externos con API() y los drivers de NEWAPI()
Registra un driver para un servicio con NEWAPI() y llámalo desde las acciones con API(name, schema, data), con el mismo estilo de callback, error y promesa que el query builder.
Habla con modelos de lenguaje con AIMODEL(), NEWAIMODEL() y AIPARSER()
Cree una solicitud de chat con AIMODEL(), permita que un conductor registrado con NEWAIMODEL() la envíe a un proveedor y lea las respuestas transmitidas con AIPARSER().
Limita los intentos fallidos con BLOCKED
Cuenta los intentos por dirección IP con BLOCKED() y responde 429 al alcanzar el límite, para logins y restablecimientos de contraseña.
Los pequeños asistentes globales: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY y PROMISIFY
Utilice los globales de la aplicación, las fechas, las copias profundas, las líneas de consulta y los ayudantes prometidos.
Reúne errores con ErrorBuilder, regístralos con ERROR() y guarda un rastro de auditoría con AUDIT()
Responde con varios errores a la vez usando ErrorBuilder, la respuesta SUCCESS(), cómo ERROR() registra los fallos y cómo AUDIT() añade a un archivo de registro quién hizo qué.
Retrasa trabajo con setTimeout2() y clearTimeout2()
Usa setTimeout2() para ejecutar una función una sola vez cuando dejan de llegar llamadas, reemplazando el temporizador anterior con el mismo id, y cancélalo con clearTimeout2().
Tokens ligados a un navegador con ENCRYPTREQ() y DECRYPTREQ()
Cifra un valor junto con el user agent (y opcionalmente la dirección IP) de la petición y léelo de vuelta solo desde el mismo cliente.
Haz una copia de una carpeta con BACKUP() y RESTORE(), y ejecuta comandos con SHELL()
Empaqueta un directorio en un solo archivo y desempaquétalo de nuevo con BACKUP() y RESTORE(), y ejecuta un comando de la shell en la carpeta del proyecto con SHELL().
Pon la aplicación en mantenimiento con PAUSESERVER()
Pausa el servidor por nombre para que cada petición reciba una página 503, reanúdalo y ten en cuenta que sin segundo argumento la llamada alterna el estado.
Reglas de negocio como texto con NEWMACRO()
Compila reglas pequeñas escritas en un lenguaje sencillo (IF, ELSE, AND, OR, RETURN, llamadas a helpers) en una función que ejecutas con un modelo, de modo que las reglas puedan vivir en un archivo o en una base de datos.
Sirve ficheros estáticos desde la carpeta public
Los ficheros del directorio public se sirven automáticamente, sin necesidad de ruta.
Llama a otra dirección con AJAX() desde el servidor
Usa AJAX() para llamar a una dirección HTTP con un cuerpo JSON y obtener la respuesta ya interpretada, como promesa o con callback, y entiende qué pasa con los errores y con XML.
Llama a otras APIs HTTP con RESTBuilder
Haz peticiones GET y POST a otro servicio, define cabeceras y un timeout, y lee el estado y la respuesta ya interpretada.
Libera un stream cuando termina con CLEANUP()
Usa CLEANUP() para destruir un stream en cuanto ha terminado o ha fallado, de modo que no queden manejadores de archivo abiertos, con un callback o como promesa.
Traduce una vista a varios idiomas
Marca los textos con @(...) en las vistas y aporta las traducciones en ficheros de recursos elegidos con LOCALIZE().
Ejecuta código con una programación usando CRON
Registra una función con CRON() y una línea cron de cinco campos, y entiende cuándo se comprueba y cómo se elimina una tarea.
Ejecuta trabajo pesado en un hilo o en un proceso hijo
Usa NEWTHREAD() para arrancar un hilo worker, enviarle mensajes y leer sus respuestas sin bloquear el proceso principal.
Comparte unos pocos hilos de trabajo con NEWTHREADPOOL()
Arranca un número fijo de workers, toma uno con pool.exec() cuando haya trabajo, devuélvelo con release() y deja que los demás trabajos esperen a un worker libre.
Llama a otros servidores con REQUEST y guarda archivos con DOWNLOAD
Usa REQUEST() para llamadas HTTP de bajo nivel con control total del método, las cabeceras, la query y el cuerpo, y DOWNLOAD() para descargar un archivo remoto al disco.
Envía un correo desde una vista
Configura SMTP en el archivo config, renderiza una vista como cuerpo del mensaje con MAIL() y envía HTML ya preparado con HTMLMAIL().
Personaliza las páginas 404 y 401
Registra manejadores ROUTE('#404') y ROUTE('#401') para reemplazar las páginas de error integradas y dispáralos tú mismo con $.fallback().
Envíate un mensaje con LOGMAIL()
Envía un mensaje de texto plano o JSON a una dirección sin vista, para registros y alertas, con la misma configuración SMTP que MAIL().
Envía archivos y streams al cliente
Sirve un archivo del disco con $.file(), fuerza un nombre de descarga, envía contenido generado con $.stream() y responde 404 cuando el archivo no existe.
Reenvía peticiones a otro servidor
Usa PROXY() para asignar un prefijo de URL a un servidor de destino, elige cómo se copia la ruta y usa $.proxy() para reenviar una sola ruta.
Publica un servidor local a través de un túnel con PROXYSERVER() y PROXYCLIENT()
Deja que un servidor Total.js con dirección pública reenvíe peticiones a un programa que solo funciona en una máquina privada, con un túnel WebSocket que abre el lado privado.
Protege formularios y peticiones con tokens CSRF
Crea un token con $.csrf(), envíalo con la petición y verifícalo en un middleware para rechazar las peticiones de otros sitios.
Agrupa acciones en un schema y reutiliza definiciones de input
Usa NEWSCHEMA() para declarar acciones relacionadas bajo un mismo nombre y comparte una definición de input entre acciones con un archivo en jsonschemas/.
Construye un pipeline de procesamiento con transforms
Registra varios pasos bajo un mismo nombre con NEWTRANSFORM() y haz pasar un valor por ellos en orden con TRANSFORM().
Intercambia mensajes con el Total Messaging Service
Activa el endpoint WebSocket de TMS y deja que clientes externos reciban mensajes publicados, envíen mensajes a tu aplicación y llamen a sus funciones.
Crea un recurso REST completo con acciones
Declara las acciones query, read, insert, update, patch y remove sobre la base NoSQL, con validación, un 404 para los registros que no existen y rutas que asignan cada método HTTP.
Configura una ruta WebSocket con flags, autenticación y parámetros
Elige el tipo de mensaje con @text o @binary, exige un usuario autenticado con el prefijo +, comprueba un token CSRF con @csrf y lee parámetros de la URL en rutas SOCKET.
Minifica y combina CSS, JavaScript y HTML
Los archivos estáticos y las respuestas HTML se minifican automáticamente; usa MERGE() para servir varios archivos como uno y los ajustes $minify para desactivarlo.
Redimensiona y convierte imágenes
Procesa imágenes con Image.load(), encadena operaciones de redimensionado, recorte y formato, guarda el resultado, mide su tamaño y sirve miniaturas con $.image().
Verificar los límites del esquema numérico en lugar de asumir la coerción completa
Véase Int, SmallInt, TinyInt y Number2 con esquemas compactos nativos, incluyendo valores fraccionados, entradas cero y fuera de rango.
Usa los helpers integrados de string, number, date y array
Total.js amplía String, Number, Date y Array con helpers para slugs, hashes, formato, parseo, agrupación y búsqueda, y ofrece U.extend() y U.clone() para objetos.
Registre eventos de auditoría de acciones con un receptor de auditoría nativo
Observe la opción de auditoría y las llamadas $.audit() explícitas sin ponerse en contacto con un servicio de registro ni escribir datos confidenciales en el registro de una aplicación.
Ejecuta en modo debug y en modo release
Las opciones de Total.run() eligen entre el modo debug y el release; lee el modo con DEBUG y limita las rutas a un modo con @debug y @release.
Prueba la aplicación con el ejecutor de tests integrado
Escribe un test.js que arranque la aplicación, registre tests con Test.push(), compruebe los resultados con Test.print() y termine con un código distinto de cero cuando uno falle.
Utilice todos los núcleos CPU con el modo de cluster
Comienza varios procesos de trabajadores detrás de un puerto con la opción de cluster de Total.run(), y sabe lo que se comparte entre ellos y lo que no es.
Carga un módulo JavaScript desde una URL con IMPORT()
Descarga un archivo con JavaScript desde una dirección, guárdalo en la carpeta tmp, haz require y usa lo que exporta; la segunda llamada no lo descarga otra vez.
Construye un flujo de componentes con Flow.load() y ejecútalo con exec()
Describe un FlowStream como componentes y las conexiones entre ellos, cárgalo en la aplicación, envía un mensaje a través de él y lee la respuesta, y cambia la configuración de un componente mientras se ejecuta.
Prueba un componente de Flow por sí solo con Flow.test()
Carga un componente en un flujo propio, envíale un mensaje desde el código y lee lo que envía a sus salidas, sin construir el flujo entero.
Llama a un programa Python que sigue en marcha con PYPELINE()
Arranca un script de Python desde la aplicación, envíale mensajes JSON por un socket y recibe sus respuestas, con el script reiniciado si muere.
Enums y límites de validación en formato de string
Executar controles de esquema compacto positivos y negativos para enums, Color, Base64, Zip, Icon, JSON y formatos IP.
TotalAPI y Componentator límites de servicio
Verificar la rama de TotalAPI y el uso local de Componentator sin realizar llamadas de servicio externas.
QueryBuilder operaciones, filtros y contratos de conductor
Inspectar las opciones nativas de DB y NEWDB, resultados queudados, errores y formas de filtro sin confundir a un constructor con un conductor de datos.
Compilar y ejecutar un componente nativo del servidor
Compila el componente de HTML confiado Total.js, crea un ejemplo, valida los mensajes, reconfigura y libera sus recursos.
Controlador de llamadas, autorización manual y respuestas condicionales
Ejecución de jsonstring, respuesta, hecho, exitoso, autorizado, personalizado y recientemente modificado manejo.
Opciones de transporte de acción y publicación TMS explícita
Testar, cifrar, comprimir y publicar contra HTTP y TMS reales en lugar de asumir que los metadatos se aplican.
Caches estáticos en modo de liberación con Touch
Servir y modificar un archivo estático temporal, eliminar su representación cachada y eliminar las entradas 404 cachadas.
RPC, eventos y conexiones compartidas
Exerce OPENCLIENT con una fijación de protocolo local, incluida la iniciación, la correlación de llamadas, el timout y la eliminación del cliente lógico.
Cargar archivos de FlowStream y ejecutar trabajadores aislados
Ejecutar el mismo esquema de confianza de FlowStream como un hilo de trabajadores y un proceso infantil, cargar archivos .flow y eliminar ejemplos.
El ciclo de acción, la extensión del resultado y los guardias de administradores
Exerce la entrada, la salida, el extendimiento y el su con acciones válidas, inactivas y falladas.
SQL real con las transacciones nativas de QueryBuilder y SQLite
Registrar un controlador limitado de SQLite, ejecutar CRUD paramétrico y confirmar el compromiso, restringir el fracaso y girar contra una base de datos compatible con los archivos.
Carga los recursos de la aplicación y evita las sorpresas del paquete de tiempo
Ejecutar LOAD en un proceso separado y verificar NPMINSTALL reutilización de un paquete ya disponible sin acceso a la red.
Consultar un directorio LDAP local real
Consulta una instancia OpenLDAP aislada y verifica el resultado del enlace en total5 0.0.19.
Archivos de aplicación como un paquete Total.js
Crea un paquete local, cargue sus definiciones a través del cargador de startup y verifica la extracción en .src.
Limpieza propia de archivos cargados y creación de enlaces de consulta.
Verifique la limpieza de carga predeterminada, el borrado automático (falso), el borrado explícito y el reemplazo de consultas href.