web-dev-qa-db-fra.com

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

En ce moment, je stocke mes données de session dans le "magasin de mémoire" fourni avec connect (express). Mais je veux/dois changer cela pour la production.

L'application utilise mongodb et j'ai installé Mangoose pour gérer toutes les communications de base de données.

par exemple. Connectez-vous à la base de données 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 module connect-mongodb, mais je ne sais pas comment le mettre en œuvre avec mangouste, ou si c'est réellement possible? J'ai besoin d'ajouter quelque chose comme ça:

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 à la base de données une seconde fois en utilisant directement le module mongodb?

37
pkyeck

à la fin, j'utilise un peu de chaque réponse donnée auparavant:

  • j'ai changé de connect-mongodb en module connect-mongo
  • j'utilise un objet général conf pour stocker mes données de configuration
  • il y a deux connexions à la base de données parce que c'est plus facile à gérer pour moi (peut-être changé plus tard, si/quand une nouvelle version de mongoose/express sortira)

exigences:

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

objet conf:

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'
};

alors je peux le configurer comme ça:

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 connectez-vous enfin à mongodb une seconde fois en utilisant 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);
});
42
pkyeck

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

27
Raja

Il semblerait que vous puissiez le faire pour configurer connect-mongodb en 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 })
}));
7
Peter Lyons

Pour express 4x:

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

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'
};

app.configure(function(){
  app.use(express.cookieParser());
  app.use(session({
    secret: conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(conf.db)
  }));
});

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);
});

session a été déplacé vers son propre module, vous devez donc require et utiliser session lors de la configuration de MongoStore.

3
Cory Klein

Donc, connect-mongodb n'utilise pas Mongoose, il utilise le pilote node-mongodb-native (i.e .:npm install mongodb). Mongoose dépend également de ce pilote, il devrait donc être présent.

En regardant le code directement , vous devez fournir vos informations de connexion à la base de données sous la forme d'un objet MongoStore:

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

Généralement, vous souhaiterez avoir un objet ou une variable "config" pouvant être chargé dynamiquement (dev vs test vs prod). Ensuite, vous extrayez l'hôte/port/db/auth de cet objet config.

3
Gates VP

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

Vous pouvez également transmettre une URL de connexion telle que mongodb: // user: [email protected]/db_name.

Ces deux méthodes vont automatiquement démarrer une nouvelle connexion, que vous ayez ou non déjà une connexion manga.

Dans le dernier code, vous pouvez transmettre un handle à une connexion existante, une instance de mongodb.Db. Avec mangouste, ce serait mongoose.connection.db. Cependant, ce code ne fait pas partie d'une version réelle et lorsque je l'ai essayé, cela n'a pas fonctionné. Probablement pas encore prêt à être utilisé (ou non testé).

Je suis sûr que si vous attendez la prochaine version, vous pourrez passer par une connexion existante de mangouste. En attendant, vous devrez simplement accepter d'avoir deux connexions, l'une de mangouste et l'autre de connect-mongodb.

J'ai eu les informations de connexion de https://github.com/tedeh/connect-mongodb et j'ai obtenu les informations de pseudo en visualisant la source ( pertinent commit ).

1
Andz

Je viens de tomber sur mangouste-session

Très léger et parfaitement travaillé pour moi. De github ...

Installation

npm install mongoose-session

Utilisation

var express = require('express');

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/db');

var app = express();

app.use(require('express-session')({
    key: 'session',
    secret: 'SUPER SECRET SECRET',
    store: require('mongoose-session')(mongoose)
}));
0
Sean McClory