De Express a Total.js 5
Total.js no es Express con otro nombre. Las mayores diferencias: un manejador recibe un solo objeto, $, en lugar de (req, res); el cuerpo lo analiza el framework según su tipo de contenido; no instalas paquetes para cookies, subidas, validación, sesiones, CORS, cron o correo, porque forman parte del framework; y los archivos de tu proyecto se cargan desde carpetas en lugar de importarse (consulta la página de estructura del proyecto).
Estas tablas comparan patrones habituales de Express con sus equivalentes en Total.js 5.
| Tarea | Express | Total.js 5 |
|---|---|---|
| Iniciar el servidor | app.listen(3000) | Total.run({ port: 3000 }) |
| Una ruta | app.get('/users', fn) | ROUTE('GET /users/', fn) (escribe la barra final) |
| Parámetro de ruta | app.get('/users/:id', fn) y req.params.id | ROUTE('GET /users/{id}/', fn) y $.params.id |
| Cadena de consulta | req.query.page | $.query.page |
| Cuerpo JSON | app.use(express.json()) y req.body | $.body, analizado según su tipo de contenido |
| Cabeceras de la petición | req.headers['x-token'] | $.headers['x-token'] |
| Enviar JSON | res.json(object) | $.json(object) |
| Enviar texto o HTML | res.send('text') | $.plain('text') o $.html('<p>..</p>') |
| Código de estado | res.status(404).json(...) | $.invalid(404) para un error, o $.response.status = 201 antes de responder |
| Cabecera de la respuesta | res.set('x-a', 'b') | $.response.headers['x-a'] = 'b' |
| Redirección | res.redirect('/x') | $.redirect('/x') |
| Cookies | cookie-parser, res.cookie(...) | $.cookie('name') para leer, $.cookie('name', value, '1 day') para escribir |
| Middleware en una ruta | app.get('/a', mw, fn) | MIDDLEWARE('mw', ($, next) => ...) y ROUTE('GET /a/ #mw', fn) |
| Archivos estáticos | app.use(express.static('public')) | Pon los archivos en public/: sin código |
| Descargar un archivo | res.download(path, name) | $.file(path, name) |
| Plantilla | res.render('page', model) | $.view('page', model) |
| Validar la entrada | express-validator o zod | input: '*email:Email, age:Number' en una acción |
| Página de error | un middleware de manejo de errores | ROUTE('#404', fn) y ROUTE('#401', fn) |
| Autenticación | passport o express-session | AUTH(fn) y ROUTE('+GET /private/', fn) |
| Subidas de archivos | multer | el flag @upload y $.files |
| CORS | cors | CORS('https://example.com') |
| Llamar a otra API | axios o fetch | REQUEST() y RESTBuilder |
| Tareas programadas | node-cron | CRON('0 9 * * 1-5', fn) |
| Enviar correo | nodemailer | MAIL() y HTMLMAIL() con mail_smtp en config |
| WebSocket | ws o socket.io | ROUTE('SOCKET /chat/', fn) |
Cada parte tiene una receta con más detalle; esta es toda la correspondencia en un solo lugar. El ejemplo de abajo es el lado de Total.js de las filas que necesitan código.
MIDDLEWARE('mw', function($, next) {
$.response.headers['x-a'] = 'b';
next();
});
NEWACTION('Users/create', {
name: 'Create a user',
input: '*email:Email, age:Number',
action: function($, model) {
$.callback({ email: model.email, age: model.age });
}
});exports.install = function() {
ROUTE('GET /users/{id}/', user);
ROUTE('POST /users/ --> *Users/create');
ROUTE('GET /mw/ #mw', ok);
ROUTE('GET /created/', created);
ROUTE('GET /moved/', moved);
ROUTE('GET /cookie/', cookie);
ROUTE('GET /html/', html);
};
function user($) {
$.json({ id: $.params.id, page: $.query.page, token: $.headers['x-token'] });
}
function ok($) {
$.json({ ok: true });
}
function created($) {
$.response.status = 201;
$.json({ created: true });
}
function moved($) {
$.redirect('/users/1/');
}
function cookie($) {
$.cookie('visited', 'yes', '1 day');
$.json({ before: $.cookie('visited') || null });
}
function html($) {
$.html('<p>Hello</p>');
}