37 votes

node.js + express.js: traitement de session avec mongodb / mongoose

Je suis en train de stockage de mes données de session dans le "mémoire" qui est livré avec connect(express). Mais je veux/dois changer cela pour la production.

L'application utilise mongodb et j'ai installé mangouste pour gérer toutes les db-communications.

par exemple, se Connecter à la DB après l'initialisation de mon application:

var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
  app.listen(3000);
}

J'ai trouvé le connectez-mongodb module, mais je ne sais pas comment la mettre en œuvre à l'aide de la mangouste, ou si c'est réellement possible? J'ai besoin d'ajouter quelque chose comme ceci:

var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: 'myDb' })
}));

ou dois-je définir ma connexion db une seconde fois en utilisant mongodb-module directement?

42voto

pkyeck Points 6158

à la fin, je suis en utilisant un peu de chaque réponse qui a été donnée avant:

  • je suis passé de connectez-mongodb pour se connecter-mongo module
  • je suis à l'aide d'un général conf objet pour stocker mes données de configuration
  • il y a deux db connections car il est plus facile à gérer pour moi (peut-être changé plus tard sur, si/quand une nouvelle version de la mangouste/express qui vient de sortir)

exigences:

var express = require('express'),
    MongoStore = require('connect-mongo')(express),
    mongo = require('mongoose');

conf objet:

var conf = {
  db: {
    db: 'myDb',
    host: '192.168.1.111',
    port: 6646,  // optional, default: 27017
    username: 'admin', // optional
    password: 'secret', // optional
    collection: 'mySessions' // optional, default: sessions
  },
  secret: '076ee61d63aa10a125ea872411e433b9'
};

ensuite, je peux le configurer comme ceci:

app.configure(function(){
  // ...
  app.use(express.cookieParser());
  app.use(express.session({
    secret: conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(conf.db)
  }));
  // important that this comes after session management
  app.use(app.router);
  // ...
});

et enfin de se connecter à mongodb une deuxième fois à l'aide de la mangouste:

var dbUrl = 'mongodb://';
dbUrl += conf.db.username + ':' + conf.db.password + '@';
dbUrl += conf.db.host + ':' + conf.db.port;
dbUrl += '/' + conf.db.db;
mongo.connect(dbUrl);
mongo.connection.on('open', function () {
  app.listen(3000);
});

27voto

Yadheendran Points 676

Merci d'inclure

 app.use(express.cookieParser());
 

directement avant

 app.use(express.session({
 

Sinon, jette l'erreur comme ci-dessous,

TypeError: Impossible de lire la propriété 'connect.sid' de non définie

7voto

Peter Lyons Points 47794

Il semble que vous puissiez le faire pour configurer connect-mongodb supposant que votre code de connexion mangouste ci-dessus est exécuté plus tôt:

 app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: mongoose.connections[0].db })
}));
 

3voto

Gates VP Points 26481

Donc, connect-mongodb ne pas utiliser la Mangouste, il utilise l' node-mongodb-native pilote (c'est à dire: npm install mongodb). Mangouste dépend aussi de ce pilote, de sorte qu'il devrait être présent.

En regardant le code directement, vous devrez fournir vos informations de connexion à la DB en tant que MongoStore objet:

store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })

Généralement, pour ce faire, vous aurez besoin de quelques "config" de l'objet ou de la variable qui peuvent être chargés dynamiquement (dev vs test vs prod). Ensuite, vous tirez l'hôte/port/db/auth hors de l'objet de configuration.

1voto

Andz Points 1212

Vous pouvez passer d'un objet de connexion de détails (hôte, nom d'utilisateur, mot de passe, etc.).

Vous pouvez également passer une url de connexion comme mongodb://user:pass@host.com/db_name.

Ces deux méthodes seront automatiquement commencer une nouvelle connexion, indépendamment de si oui ou non vous ont déjà ou vont démarrer une mangouste connexion.

Dans la dernière version du code, vous pouvez passer à une poignée à une connexion existante, une instance de mongodb.Db. Avec la mangouste, ce serait mongoose.connection.db. Cependant, ce code n'est pas dans un rejet réel, et quand je l'ai essayé, ça ne fonctionne pas. Probablement pas prêts à être utilisés (ou non testé).

Je suis sûr que si vous attendez la prochaine version, vous serez en mesure de passer à une mangouste connexion. Dans le temps, vous aurez besoin juste d'accepter d'avoir deux connexions, l'une à partir de la mangouste et un de connectez-mongodb.

J'ai eu les infos de connexion à partir de https://github.com/tedeh/connect-mongodb et j'ai eu de la poignée de l'information à partir de l'affichage de la source (commit).

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