En una publicación pasada vimos cómo hacer un seguimiento del usuario mediante socket.io, otra alternativa para guardar información del usuario en nuestra aplicación entre página y página, son las sesiones. En esta ocasión haremos un sencillo ejemplo donde un usuario tendrá que registrar su nombre, y luego podrá recuperar éste en otra página.
En primer lugar vamos a crear un nuevo proyecto con Express e instalar las dependencias, algo que a estas alturas deberíamos saber hacer.
Una vez realizado este proceso vamos a abrir nuestro archivo app.js, y vamos a buscar esta línea:
app.use(app.router);
Debajo de la misma vamos a agregar:
app.use(express.cookieParser()); app.use(express.session({secret: 'abcd1234'}));
Esto es necesario en Express para configurar el uso de sesiones. Además debemos ingresar una clave secreta para así proteger nuestros datos:
{secret: 'abcd1234'}
Luego el uso de sesiones es muy sencillo, para crear una sesión debemos usar un objeto llamado session. Por ejemplo:
app.get('/ejemplo', function(req, res){ if(req.session.nombre){ res.send('Hola ' + req.session.nombre); }else{ var nombre = 'Tito'; req.session.nombre = nombre; res.send('Hola usuario desconocido. De ahora en adelante te llamaremos ' + nombre); } });
Como se ve en el ejemplo, primero preguntamos que exista un atributo de sesión nombre:
if(req.session.nombre)
Si existe, osea que el usuario ya ha registrado su nombre, entonces lo saludamos por el valor de éste:
res.send('Hola ' + req.session.nombre);
Si en cambio no existe, simplemente saludamos al usuario como anónimo y seteamos el valor de esta propiedad con un valor cualquiera, para saludarlo por ese nombre la próxima vez que ingrese a nuestro sitio:
var nombre = 'Tito'; req.session.nombre = nombre; res.send('Hola usuario desconocido. De ahora en adelante te llamaremos ' + nombre);
Para continuar vamos a realizar un sencillo sistema para registrar un nombre, mostrar ese nombre y luego la posibilidad de cerrar la sesión.
Primero crearemos un nuevo módulo dentro de nuestra carpeta routes, al que yo llamaré sesiones.js, que tendrá el siguiente código:
exports.get_identificacion = function(req, res){ res.render('sesiones/identificacion'); }; exports.post_identificacion = function(req, res){ req.session.nombre = req.body.nombre; res.redirect('/bienvenida'); }; exports.bienvenida = function(req, res){ if(req.session.nombre){ res.render('sesiones/bienvenida', {nombre: req.session.nombre}); }else{ res.redirect('/identificacion'); } }; exports.salir = function(req, res){ req.session.nombre = null; res.redirect('/identificacion'); };
Y luego iremos dentro de nuestra carpeta views, y dentro crearemos otra carpeta de nombre sesiones, y dentro de esta última dos vistas jade.
Una llamada identificacion.jade, con el siguiente código:
extends ../layout block content h1 Identificación form(method="post", action="/identificacion") label Nombre input(type="text", name="nombre", required="required") input(type="submit", value="Identificarse")
Y otra llamada bienvenida.jade:
extends ../layout block content h1 Identificación p Bienvenido/a #{nombre} p a(href="/salir") Salir
Y ahora vamos a modificar nuevamente nuestro archivo node.js. Vamos a agregar el módulo que acabamos de agregar:
var sesiones = require('./routes/sesiones');
Y vamos a llamar a las cuatro acciones de este módulo:
app.get('/identificacion', sesiones.get_identificacion); app.post('/identificacion', sesiones.post_identificacion); app.get('/bienvenida', sesiones.bienvenida); app.get('/salir', sesiones.salir);
El código es muy sencillo.
En la primer acción cargamos un formulario, con un campo de ingreso para el nombre, y un botón para enviarlo.
La segunda acción recibirá el nombre que se envía de la primera, y lo guardará en la sesión
La tercera acción va a verificar si existe una sesión con el atributo nombre, creada previamente. De ser así le dará la bienvenida al usuario con su nombre. Pero de lo contrario lo va a redireccionar a la primer acción para registrarlo.
Y por último tendremos una acción para cerrar la sesión, igualando a null el nombre.
Anterior: Introducción a Node.js, parte 14: Conectar Node.js con MySQL