Cómo finalizar una sesión en ExpressJS

88

Siento que esto tiene que estar enterrado en algún lugar de la documentación, pero no puedo encontrarlo.

¿Cómo se cierra, finaliza o elimina (lo que sea) una sesión en ExpressJS?

Stephen
fuente

Respuestas:

122

Respuesta actualizada Express 4.x

El manejo de sesiones ya no está integrado en Express. Esta respuesta se refiere al módulo de sesión estándar: https://github.com/expressjs/session

Para borrar los datos de la sesión, simplemente use:

req.session.destroy();

La documentación es un poco inútil al respecto. Dice:

Destruye la sesión, eliminando req.session, se volverá a generar la próxima solicitud. req.session.destroy(function(err) { // cannot access session here })

Esto no significa que la sesión actual se volverá a cargar en la próxima solicitud. Significa que se creará una sesión limpia y vacía en su tienda de sesiones en la próxima solicitud. (Es de suponer que el ID de la sesión no cambia, pero no lo he probado).

Puntilla
fuente
¿Hay alguna manera de destruir la sesión de las sesiones y no de la solicitud inmediata? Por ejemplo, si tuviera que implementar la funcionalidad de cerrar sesión en todos los dispositivos, necesitaría eso
Muhammad Umer
1
@MuhammadUmer Hasta donde yo sé, no existe un mecanismo incorporado para destruir una sesión arbitraria. Puede implementar esto usted mismo fácilmente eliminando las claves asociadas con la sesión del almacenamiento o creando su propio contenedor de sesión.
Brad
93

No importa, es req.session.destroy();

Stephen
fuente
8
Esto no funciona para mí en Express 3 .. Estoy tratando de llamar a ´req.session.destroy () ´
acidghost
6
Funcionando bien para mí en ExpressJS 3.00. Usado req.session.destroy();como lo hizo acidghost.
hexacianuro
1
el uso de req.session.destroy () también me funciona en Express 2.5
TulioPa
1
¿Dónde está documentado esto? Estoy tratando de encontrarlo.
huggie
25

La pregunta no aclaró qué tipo de tienda de sesiones se estaba utilizando. Ambas respuestas parecen ser correctas.

Para sesiones basadas en cookies:

De http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Para sesiones basadas en Redis, etc.

req.session.destroy // Deletes the session in the database.
Camisas azules
fuente
1
req.session.destroy es esencialmente un contenedor para "eliminar req.session", consulte el código fuente aquí: github.com/expressjs/session/blob/master/session/session.js
tfmontague
6

utilizar,

delete req.session.yoursessionname;
Nithin
fuente
Realmente me gustaría ver un documento sobre esto.
Lazy
5
Para todos aquellos que votaron en contra de @Nithin; el método de función session.destroy () como se documenta en github (github.com/expressjs/session/blob/master/session/session.js) usa "delete this.req.session" - no es exactamente la respuesta de @ Nithin, pero el uso de "eliminar" también es una solución correcta (y no se trata en otras respuestas).
tfmontague
¿Es esta la solución adecuada? Sin pérdida de memoria, cualquier cosa traviesa no sucederá, ¿verdad?
Rajath
5

Usar req.session = null;, en realidad no eliminará la instancia de sesión. La solución más adecuada sería req.session.destroy();, pero esto es esencialmente una envoltura para delete req.session;.

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};
tfmontague
fuente
5

Session.destroy (devolución de llamada)

Destruye la sesión y anulará la propiedad req.session. Una vez completada, se invocará la devolución de llamada.

↓ Forma segura ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Camino inseguro ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
fuente
0
req.session.destroy(); 

Lo anterior no funcionó para mí, así que hice esto.

req.session.cookie.expires = new Date().getTime();

Al establecer el vencimiento de la cookie a la hora actual, la sesión expiró por sí sola.

John Quasar
fuente
-5

Como se mencionó en varios lugares, tampoco puedo hacer que la función req.session.destroy () funcione correctamente.

Este es mi trabajo alrededor ... parece funcionar, y aún permite que se use req.flash

req.session = {};

Si elimina o establece req.session = null; , parece que no puedes usar req.flash

Gene Bo
fuente
1
Este es un problema de seguridad, ya que no cambia el hash de la sesión
Tosh