Il existe deux solutions possibles au problème :
Assigner un objet vide
req.session = {};
Le ramasse-miettes nettoiera automatiquement la mémoire. Cette variante est très rapide et fonctionnera dans la plupart des cas, cependant, vous devez l'utiliser avec précaution, car elle peut conserver les références aux objets en mémoire. Cette mise en garde est décrite dans la section TLDR ci-dessous.
Supprimer les propriétés une par une
Object.keys(object).forEach(key => delete object[key]);
Cela nettoiera l'objet en parcourant chaque propriété non-prototype et en la supprimant. C'est plus sûr mais plus lent. Vous devez décider s'il est pertinent de l'utiliser dans un cas particulier.
TLDR
Toute solution donnée ci-dessus fera l'affaire pour l'auteur dans la situation actuelle, ainsi que toute autre solution valide fournie dans cette question. Cela dépend principalement de la manière dont le développeur souhaite manipuler les données obsolètes.
L'objet de session peut contenir des données qui sont liées par différentes variables, et le fait de définir un nouvel objet vide pour req.session
ne rompra pas la référence aux anciennes données, de sorte que les anciennes données seront disponibles là où elles sont encore nécessaires. Bien que la bonne manière de conserver les anciennes données soit de cloner l'objet initial, les scénarios réels peuvent être différents. Regardons l'exemple suivant :
req.session.user = { name: "Alexander" }; // nous stockons un objet dans la session
var session = req.session; // sauvegarder la référence à la session dans une variable
console.log( req.session, session ); // {user: Object}, {user: Object}
req.session = {}; // remplaçons la session par un nouvel objet
console.log( req.session, session ); // {}, {user: Object}
Nous pouvons toujours récupérer les anciennes données de la variable session
mais req.session
est vide : ici, le fait de définir un nouvel objet fonctionne comme une sorte de clonage profond. Le ramasse-miettes ne supprimera pas les données de l'ancien objet req.session
car il est toujours référencé par la variable session
.
Un nettoyage profond de l'objet avec :
Object.keys(object).forEach(key => delete object[key]);
... supprimera explicitement toutes les valeurs de l'objet req.session
et, comme la variable session
est liée au même objet, session
deviendra également vide. Voyons comment cela fonctionne :
req.session.user = { name: "Alexander" }; // nous stockons un objet dans la session
var session = req.session; // sauvegarder la référence à la session dans une variable
console.log( req.session, session ); // {user: Object}, {user: Object}
Object.keys(req.session).forEach(key => delete req.session[key]);
console.log( req.session, session ); // {}, {}
Comme vous pouvez le voir maintenant, dans les deux cas nous obtenons des objets vides.
D'un point de vue de la vitesse et de la mémoire, définir un nouvel objet vide sera beaucoup plus rapide que nettoyer l'ancien objet propriété par propriété, cependant, du point de vue de la mémoire, si les anciennes données sont encore référencées quelque part, l'approche avec le nouvel objet ne libérera pas la mémoire que les anciennes données consomment.
Il est assez évident que le choix de l'approche à adopter dépend principalement de votre scénario de codage, mais dans la plupart des cas req.session = {};
fera l'affaire : c'est rapide et court. Cependant, si vous conservez des références à l'objet d'origine dans d'autres variables, vous pouvez envisager d'utiliser la suppression implicite des propriétés d'objet en profondeur.