node.js + express.js:使用mongodb / mongoose进行会话处理

现在我将会话数据存储在与“连接”(express)绑定在一起的“内存存储”中。 但我想/必须改变这个生产。

应用程序正在使用mongodb,我安装mongoose来处理所有的数据库通信。

例如初始化我的应用程序后连接到数据库:

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

我find了连接mongodb模块,但我不知道如何使用mongoose来实现它,或者如果它实际上是可能的? 我需要添加这样的东西:

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

或者我必须直接使用mongodb模块第二次定义我的数据库连接?

最后,我使用了以前给出的每一个答案:

  • 我从connect-mongodb切换到connect-mongo模块
  • 我使用一个普通的conf对象来存储我的configuration数据
  • 有两个数据库连接,因为它更容易为我处理(也许以后改变,如果/当一个新版本的mongoose/快递出来)

要求:

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

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

那么我可以像这样configuration它:

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

最后再用mongoose连接到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); }); 

请包括

 app.use(express.cookieParser()); 

直接在之前

 app.use(express.session({ 

否则抛出错误如下,

TypeError:无法读取未定义的属性“connect.sid”

看起来你可以这样做来设置connect-mongodb假设你的mongoose连接代码是早先运行的:

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

所以connect-mongodb不使用Mongoose,它使用node-mongodb-native驱动程序( 即: npm install mongodb )。 mongoose也取决于这个驱动程序,所以它应该存在。

直接查看代码 ,您必须提供您的数据库连接信息作为一个MongoStore对象:

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

通常对于这个,你会想要有一些“configuration”对象或variables,可以dynamic加载(开发VStesting与产品)。 然后,将该configuration对象的host / port / db / authclosures。

对于快递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已经被移动到它自己的模块,所以你需要在configurationMongoStorerequire它并使用session

您可以传入连接详细信息对象(主机,用户名,密码等)。

您也可以传入连接url,例如mongodb:// user:pass@host.com/db_name。

这两种方法都会自动启动一个新的连接,无论你是否已经有或将开始一个mongoose连接。

在最新的代码中,可以将句柄传递给现有的连接,即mongodb.Db一个实例。 用mongoose,这将是mongoose.connection.db 。 但是,这个代码并没有在实际的版本中,当我尝试它时,它不起作用。 可能尚未准备好使用(或未经testing)。

我敢肯定,如果你等待下一个版本,你将能够通过一个现有的mongoose连接。 同时你只需要接受两个连接,一个来自mongoose,另一个来自connect-mongodb。

我从https://github.com/tedeh/connect-mongodb获得了连接信息,并从查看源代码(; 相关提交 )中获得了句柄信息。

我只是偶然发现了mongoose会议

非常轻量级,为我工作无缝。 从github …

安装

 npm install mongoose-session 

使用

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