it-swarm.com.de

node.js + express.js: Session-Handling mit mongodb/mongoose

Im Moment speichere ich meine Sitzungsdaten im "Speicher", der mit connect (express) geliefert wird. Aber ich möchte/muss das für die Produktion ändern.

Die Anwendung verwendet mongodb und ich habe mongoose installiert, um alle db-Kommunikationen abzuwickeln.

z.B. Verbinden Sie sich nach der Initialisierung meiner App mit der Datenbank:

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

Ich habe das connect-mongodb-Modul gefunden, weiß aber nicht, wie ich es mit mongoose implementieren soll oder ob es tatsächlich möglich ist.

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

oder muss ich meine db-verbindung ein zweites mal mit dem mongodb-modul direkt definieren?

37
pkyeck

am Ende verwende ich ein bisschen von jeder Antwort, die zuvor gegeben wurde:

  • ich habe von Connect-Mongodb zu Connect-Mongo-Modul gewechselt
  • ich verwende ein allgemeines conf-Objekt, um meine Konfigurationsdaten zu speichern
  • es gibt zwei db-verbindungen, weil es für mich einfacher zu handhaben ist (vielleicht später geändert, wenn/wenn eine neue Version von mongoose/express herauskommt)

anforderungen:

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

conf Objekt:

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

dann kann ich es so konfigurieren:

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

und verbinden Sie sich mit mongoose ein zweites Mal mit mongodb:

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

Bitte beziehe ... mit ein

app.use(express.cookieParser());

direkt vor

app.use(express.session({

Ansonsten wirft Fehler wie unten,

TypeError: Eigenschaft 'connect.sid' von undefined kann nicht gelesen werden

27
Raja

Es sieht so aus, als könnten Sie connect-mongodb so einrichten, dass Ihr vorheriger Mongoose-Verbindungscode früher ausgeführt wird:

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

Für 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 wurde in ein eigenes Modul verschoben. Daher müssen Sie require und session verwenden, wenn Sie die MongoStore konfigurieren.

3
Cory Klein

Daher verwendet connect-mongodb nicht Mongoose, sondern den node-mongodb-native-Treiber (i.e .:npm install mongodb). Mongoose hängt auch von diesem Fahrer ab, also sollte er vorhanden sein.

Wenn Sie den Code direkt betrachten, müssen Sie Ihre DB-Verbindungsinformationen als MongoStore-Objekt angeben:

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

Normalerweise benötigen Sie dazu ein "config" -Objekt oder eine Variable, die dynamisch geladen werden kann (dev vs test vs prod). Dann ziehen Sie den Host/Port/db/auth von diesem Konfigurationsobjekt ab.

3
Gates VP

Sie können ein Objekt mit Verbindungsdetails (Host, Benutzername, Passwort usw.) übergeben.

Sie können auch eine Verbindungs-URL wie mongodb: // user: [email protected]/db_name übergeben.

Beide Methoden starten automatisch eine neue Verbindung, unabhängig davon, ob Sie bereits eine Moose-Verbindung haben oder nicht.

Im neuesten Code können Sie ein Handle an eine vorhandene Verbindung übergeben, eine Instanz von mongodb.Db. Bei mongoose wäre dies mongoose.connection.db. Dieser Code ist jedoch nicht in einer aktuellen Version enthalten, und als ich ihn ausprobierte, funktionierte er nicht. Wahrscheinlich noch nicht bereit (oder nicht getestet).

Ich bin mir sicher, wenn Sie auf die nächste Version warten, können Sie eine bestehende Moose-Verbindung weiterleiten. In der Zwischenzeit müssen Sie nur zwei Verbindungen akzeptieren, eine von mongoose und eine von connect-mongodb.

Ich habe die Verbindungsinformationen von https://github.com/tedeh/connect-mongodb und ich habe die Handle-Informationen von der Quelle ( relevantes Commit ).

1
Andz

Ich stolpere gerade über mongoose-session

Sehr leicht und funktionierte nahtlos für mich. Von github ...

Installation

npm install mongoose-session

Benutzen

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