Introducción a Node.js, parte 15: Sesiones en Express

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.

Descargar ejemplo

Anterior: Introducción a Node.js, parte 14: Conectar Node.js con MySQL