126 votes

Utilisation de MemoryStore en production

Aujourd'hui, j'ai lancé mon application Node.js en mode "production" pour la première fois et j'ai reçu cet avertissement :

Warning: connection.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and obviously only work within a single process.

Je n'ai besoin d'exécuter qu'un seul processus, mais que dois-je utiliser à la place ? Je veux que mes sessions résident dans la mémoire vive pour un accès rapide. Je veux également pouvoir supprimer toutes les sessions en fermant simplement l'application Node.

Il semble exagéré d'installer Redis, MongoDB ou une autre base de données pour cette simple tâche. Je ne comprends pas non plus pourquoi MemoryStore est inclus dans Node alors qu'il ne devrait pas être utilisé.

6voto

huggie Points 2470

L'alternative est d'utiliser Redis ou Mongo comme magasin. Avec Mongo, vous utilisez l'option session express-mongo module.

Il est conseillé de supprimer les sessions périmées à l'aide d'une option d'indexation :

var MongoStore = require('express-session-mongo');
app.use(express.session({ store: new MongoStore() }));

db.sessions.ensureIndex( { "lastAccess": 1 }, { expireAfterSeconds: 3600 } )

Comme les sessions périmées sont supprimées par la base de données elle-même, la session Express n'a pas besoin de s'occuper elle-même du nettoyage.

EDIT : Il semble que vous ayez besoin de votre propre champ "lastAccess". Lorsque vous y accédez, vous mettez ce champ à jour vous-même. Consultez la documentation de MongoDB expire-data http://docs.mongodb.org/manual/tutorial/expire-data/

EDIT2 :

Maintenant devient db.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

La tâche d'arrière-plan de Mongo qui vérifie ce champ s'exécute toutes les 60 secondes. Le moment où le document est supprimé n'est donc pas exact.

2voto

Garry May Points 21

Pour ceux qui ont des problèmes avec Redis, essayez ce qui suit - j'espère que cela vous aidera.

J'utilise Redis pour DEV et PROD et je cible Express v4. Sous Windows, j'utilise l'ensemble d'outils légers MSOpenTech Redis v3.0, sinon, j'utilise simplement l'addon Heroku Redis. Le faire fonctionner via Node n'a pas été trop difficile - jusqu'à présent...

var session = require('express-session');

. . .

var RedisStore = require('connect-redis')(session);

var redisClient = require('redis').createClient(process.env.REDIS_URL);

var redisOptions = { 
        client: redisClient, 
        no_ready_check: true,
        ttl: 600,
        logErrors: true
};

var redisSessionStore = new RedisStore(redisOptions);

app.use(session({
    store: redisSessionStore,
    secret: 'Some.Long.Series.of.Crazy.Words.and.Jumbled.letter.etc',
    resave: true,       
    saveUninitialized: true 
}));

Bonne chance !

ps. Je viens juste de relire la requête originale et j'ai remarqué ceci - désolé !

Il semble exagéré d'installer Redis, MongoDB ou une autre base de données pour cette simple tâche.

2voto

Utilisation

import createMemoryStore from "memorystore";
...
// Memory store
const MemoryStore = createMemoryStore(session);
app.use(session({
    ...
    store: new MemoryStore({
        checkPeriod: 86400000 // prune expired entries every 24h
    }),
    ...
}))

Résoudre le problème dans mon cas

0voto

Anthony Points 1

Si vous utilisez OSX, utilisez

brew install memcached

si linux

apt install memcached

résoudre le message de session, car l'application peut se connecter à 127.0.0.1:11211 service memcache.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X