node.js + express.js:session-handling mit mongodb/mongoose
Frage
Jetzt bin ich der Speicherung meiner session-Daten in den "Speicher", die im Bundle mit connect(express).Aber ich will/zu ändern, das für die Produktion.
Die Anwendung mit mongodb installiert und ich Mungo, um alle db-Kommunikation.
z.B.Eine Verbindung zu der DB nach der Initialisierung meiner app:
var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
app.listen(3000);
}
Ich fand Sie in der connect-mongodb-Modul, aber ich weiß nicht, wie es zu implementieren, mit mongoose, oder ob es tatsächlich möglich?Ich muss hinzufügen, so etwas wie dieses:
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 definieren, meine db-Verbindung ein zweites mal mit der mongodb-Modul direkt?
Lösung
Am Ende verwende ich ein bisschen jede Antwort, die zuvor gegeben wurde:
- Ich habe von Connect-MongoDB zum Connect-Mongo-Modul gewechselt
- Ich verwende ein allgemeines Konfus, 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)
Bedarf:
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 schließlich ein zweites Mal mit Mongoose mit MongoDB herstellen:
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);
});
Andere Tipps
Bitte beziehe ... mit ein
app.use(express.cookieParser());
direkt vor
app.use(express.session({
Andernfalls wirft der Fehler wie unten, aus,
TypeError: Eigenschaft 'Connect.sid' von undefined kann nicht lesen
Es sieht so aus, als könntest du das mit dem Setup tun connect-mongodb
Unter der Annahme, dass Ihr Mongoose -Verbindungscode oben oben ausgeführt wird:
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: mongoose.connections[0].db })
}));
So connect-mongodb
Verwendet keine Mongoose, es verwendet die node-mongodb-native
Fahrer (dh: npm install mongodb
). Mongoose hängt auch von diesem Fahrer ab, daher sollte er vorhanden sein.
Anschauen der Code direkt, Sie müssen Ihre DB -Verbindungsinformationen als Daten bereitstellen MongoStore
Objekt:
store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })
In der Regel möchten Sie ein "Konfigurations" -Objekt oder eine Variable haben, die dynamisch geladen werden können (Dev vs Test vs prod). Anschließend ziehen Sie das Host/Port/dB/auth von diesem Konfigurationsobjekt aus.
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 sein eigenes Modul verschoben, also müssen Sie require
es und benutze session
Beim Konfigurieren der MongoStore
.
Sie übergeben können, ein Objekt von Verbindungsdaten (host, username, password, etc.).
Sie können auch in eine Verbindungs-url wie mongodb://user:pass@host.com/db_name.
Beide dieser Methoden startet automatisch eine neue Verbindung, unabhängig davon, ob Sie bereits oder starten Sie eine Mungo-Verbindung.
In der neusten Codes, die Sie übergeben können, ein Griff zu einer bestehenden Verbindung eine Instanz von mongodb.Db
.Mit mongoose, dies wäre mongoose.connection.db
.Dieser code jedoch nicht in einer tatsächlichen release, und, wenn ich es versuchte, funktionierte es nicht.Wahrscheinlich nicht bereit verwendet zu werden, die noch (oder ungetestet).
Ich bin sicher, wenn Sie die nächste Version zu warten, Sie werden in der Lage, übergeben in einem bestehenden Mungo-Verbindung.In der Zwischenzeit müssen Sie einfach akzeptieren, dass zwei verbindungen von mongoose und eine von connect-mongodb.
Ich habe die Verbindungsinformationen aus https://github.com/tedeh/connect-mongodb und ich habe die Informationen verarbeiten anzeigen aus dem source - (relevanten commit).
Ich stolpere nur darüber Mongoose-Session
Sehr leicht und arbeitete nahtlos für mich. Von Github ...
Installation
npm install mongoose-session
Verwenden
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)
}));