现在我将会话数据存储在与connect(express)捆绑在一起的“内存存储”中。但我希望/必须改变它以进行生产。
应用程序正在使用mongodb,我安装了mongoose来处理所有数据库通信。
e.g。初始化我的应用后连接到数据库:
var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
app.listen(3000);
}
我找到了connect-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-module定义我的数据库连接?
答案 0 :(得分:42)
最后我使用了之前给出的一些答案:
要求:
var express = require('express'),
MongoStore = require('connect-mongo')(express),
mongo = require('mongoose');
conf object:
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(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);
});
答案 1 :(得分:27)
请包含
app.use(express.cookieParser());
直接
之前app.use(express.session({
否则抛出错误如下,
TypeError:无法读取未定义的属性“connect.sid”
答案 2 :(得分:7)
看起来您可以设置connect-mongodb
,假设上面的mongoose连接代码是先前运行的:
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: mongoose.connections[0].db })
}));
答案 3 :(得分:3)
因此connect-mongodb
不使用Mongoose,它使用node-mongodb-native
驱动程序(即: npm install mongodb
)。猫鼬也依赖于这个驱动程序,因此应该存在。
查看the code directly,您必须将您的数据库连接信息作为MongoStore
对象提供:
store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })
通常为此,您需要一些可以动态加载的“config”对象或变量(dev vs test vs prod)。然后从该配置对象中拉出host / port / db / auth。
答案 4 :(得分:3)
快递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
已移至其自己的模块,因此您需要require
并在配置session
时使用MongoStore
。
答案 5 :(得分:1)
您可以传入连接详细信息的对象(主机,用户名,密码等)。
您还可以传递连接网址,例如mongodb:// user:pass@host.com/db_name。
无论您是否已经拥有或将启动猫鼬连接,这两种方法都会自动启动新连接。
在最新的代码中,您可以将句柄传递给现有连接,即mongodb.Db
的实例。使用猫鼬,这将是mongoose.connection.db
。但是,此代码不在实际版本中,当我尝试它时,它不起作用。可能尚未准备好使用(或未经测试)。
我确定如果您等待下一个版本,您将能够传入现有的mongoose连接。与此同时,您只需要接受两个连接,一个来自mongoose,另一个来自connect-mongodb。
我从https://github.com/tedeh/connect-mongodb获得了连接信息,我从查看来源(relevant commit)获得了句柄信息。
答案 6 :(得分:0)
我偶然发现了mongoose-session
非常轻巧,无缝地为我工作。来自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)
}));