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
已经被移动到它自己的模块,所以你需要在configurationMongoStore
时require
它并使用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) }));