la gestion de sessions avec `express-session` et Sequelize

  • Updated : 21-05-2024 19:52
  • By : Ciscodev
  • La gestion des sessions est un aspect crucial des applications web modernes. `express-session` est un middleware populaire pour la gestion des sessions dans les applications Node.js. Cependant, pour une persistance plus robuste et une scalabilité accrue, il est souvent nécessaire de stocker les sessions dans une base de données. Cet article explique comment implémenter un stockage de sessions personnalisé en utilisant Sequelize avec `express-session`.

    Le Code

    Nous allons analyser le code qui définit une classe de stockage de sessions personnalisée, `SessionStorage`, qui étend `session.Store` de `express-session`.


    const session = require("express-session");
    const db = require("../models");
    
    


    Nous commençons par importer les modules nécessaires : `express-session` pour la gestion des sessions et `db` pour accéder aux modèles Sequelize.


    ```javascript
    class SessionStorage extends session.Store {
      constructor() {
        super()
      }
    ```
    


    La classe `SessionStorage` étend `session.Store`, permettant ainsi de définir nos propres méthodes pour gérer les sessions. Le constructeur appelle le constructeur parent.


    ```javascript
    async get(sid, callback) {
      try {
        const session = await db.Session.findOne({ where: { sid }, raw: true });
        if (session) {
          return callback(null, session);
        } else {
          return callback(null, null);
        }
      } catch (error) {
        return callback(error);
      }
    }
    ```
    


    La méthode `get` récupère une session en fonction de son ID (`sid`). Si la session est trouvée, elle est retournée via le callback. Sinon, le callback est appelé avec `null`. En cas d'erreur, le callback reçoit l'erreur.


    ```javascript
    async set(sid, sessionData, callback) {
      try {
        const expires = sessionData.cookie?.expires ? new Date(sessionData.cookie.expires) : new Date(new Date().getTime() + 36000);
        const getSession = await db.Session.findOne({ where: { sid }, raw: true });
        if (getSession) {
          await db.Session.update({ expires, data: JSON.stringify({ ...sessionData, [cookie._expires]: expires }) }, { where: { sid } });
        } else {
          await db.Session.create({ sid, expires, data: JSON.stringify({ ...sessionData, [cookie._expires]: expires }) });
        }
        callback(null);
      } catch (error) {
        console.log(sessionData);
        callback(error);
      }
    }
    ```
    


    La méthode `set` enregistre ou met à jour une session. Si une session avec le même `sid` existe déjà, elle est mise à jour avec les nouvelles données et la date d'expiration. Sinon, une nouvelle session est créée. Les données de session sont converties en JSON avant d'être stockées.

    ```javascript
    async destroy(sid, callback) {
      try {
        await db.Session.destroy({ where: { sid } });
        callback(null);
      } catch (error) {
        callback(error);
      }
    }
    ```
    


    La méthode `destroy` supprime une session en fonction de son ID (`sid`). En cas de succès, le callback est appelé avec `null`. En cas d'erreur, le callback reçoit l'erreur.


    ```javascript
    module.exports = {
      SessionStorage
    }
    ```
    


    Enfin, la classe `SessionStorage` est exportée pour être utilisée dans d'autres parties de l'application.

    Ce code montre comment créer une solution de stockage de sessions personnalisée avec `express-session` et Sequelize. En gérant les sessions dans une base de données, nous bénéficions d'une persistance accrue et d'une meilleure scalabilité pour nos applications web.