web-dev-qa-db-fra.com

Quand utiliser saveUninitialized et resave dans express-session

Je suis novice avec la pile MEAN. J'ai lu la session express github doc mais il y a quelques options qui ne me sont pas claires. Ces options sont saveUninitialized et resave.

Quelqu'un peut-il expliquer avec des exemples quels sont les avantages d'utiliser saveUninitialized et resave, et quel sera l'effet si nous changeons les valeurs booléennes dans ces options.

Syntaxe:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))
32
user7104874

Supposons que les sessions soient activées globalement (pour toutes les demandes).

Lorsqu'un client fait une requête HTTP et que cette requête ne contient pas de cookie de session, une nouvelle session est créée par express-session. La création d'une nouvelle session fait plusieurs choses:

  • générer un identifiant de session unique
  • stocker cet identifiant de session dans un cookie de session (afin que les demandes ultérieures faites par le client puissent être identifiées)
  • créer un objet de session vide, comme req.session
  • selon la valeur de saveUninitialized, à la fin de la requête, l'objet session sera stocké dans le magasin de session (qui est généralement une sorte de base de données)

Si, pendant la durée de vie de la demande, l'objet de session n'est pas modifié, à la fin de la demande et lorsque saveUninitialized est faux, l'objet de session (toujours vide, car non modifié) ne sera pas stocké dans le magasin de sessions.

Le raisonnement derrière cela est que cela empêchera un grand nombre d'objets de session vides d'être stockés dans le magasin de sessions. Puisqu'il n'y a rien d'utile à stocker, la session est "oubliée" à la fin de la demande.

Quand voulez-vous l'activer? Lorsque vous voulez pouvoir identifier des visiteurs récurrents, par exemple. Vous seriez en mesure de reconnaître un tel visiteur car il envoie le cookie de session contenant l'identifiant unique.

À propos de resave: il peut être nécessaire d'activer cette option pour les magasins de sessions qui ne prennent pas en charge la commande "touch". Cela indique au magasin de sessions qu'une session particulière est toujours active, ce qui est nécessaire car certains magasins supprimeront les sessions inactives (inutilisées) après un certain temps.

Si un pilote de magasin de sessions n'implémente pas la commande tactile, vous devez activer resave pour que même lorsqu'une session n'a pas été modifiée pendant une demande, elle soit toujours mise à jour dans le magasin (la marquant ainsi comme active) .

Cela dépend donc entièrement du magasin de sessions que vous utilisez si vous devez activer cette option ou non.

84
robertklep

Une chose à noter est que si vous définissez saveUninitialized sur false , le cookie de session ne sera pas défini sur le navigateur, sauf si la session est modifié. Ce comportement peut être implicite, mais il n'était pas clair pour moi lorsque j'ai lu pour la première fois le documentation .

12
spencer.sm