Session node.js+;express.js:mongodb/mongoose的会话处理
现在,我将会话数据存储在“内存存储”中,它与connect(express)捆绑在一起。但我想/必须为生产改变这一点 应用程序使用mongodb,我安装了mongoose来处理所有db通信 e、 g.初始化我的应用程序后连接到数据库:Session node.js+;express.js:mongodb/mongoose的会话处理,session,mongodb,node.js,express,mongoose,Session,Mongodb,Node.js,Express,Mongoose,现在,我将会话数据存储在“内存存储”中,它与connect(express)捆绑在一起。但我想/必须为生产改变这一点 应用程序使用mongodb,我安装了mongoose来处理所有db通信 e、 g.初始化我的应用程序后连接到数据库: var mongo = require('mongoose'); mongo.connect('mongodb://localhost/myDb'); mongo.connection.on('open', function () { app.listen(3
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' })
}));
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);
// ...
});
或者我必须直接使用mongodb模块第二次定义db连接吗?因此
connect mongodb
不使用Mongoose,而是使用节点mongodb本机驱动程序(即:npm安装mongodb
)。猫鼬也依赖于这个驱动程序,所以它应该存在
现在,您必须以MongoStore
对象的形式提供数据库连接信息:
store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })
通常情况下,您需要一些可以动态加载的“配置”对象或变量(dev vs test vs prod)。然后将主机/port/db/auth从该配置对象中拔出。如果上面的mongoose连接代码运行得更早,您似乎可以这样设置连接mongodb
:
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: mongoose.connections[0].db })
}));
您可以传入连接详细信息的对象(主机、用户名、密码等)
您还可以传入一个连接url,如mongodb://user:pass@host.com/db_name
这两种方法都将自动启动新连接,无论您是否已经或将启动mongoose连接
在最新的代码中,您可以将句柄传递给现有连接,mongodb.Db
的实例。对于mongoose,这将是mongoose.connection.db
。然而,这段代码并没有在实际的版本中,当我尝试它时,它没有工作。可能尚未准备好使用(或未经测试)
我相信如果您等待下一个版本,您将能够传入现有的mongoose连接。同时,您只需要接受两个连接,一个来自mongoose,另一个来自connect mongodb
我从中获得连接信息,从查看源()中获得句柄信息。最后,我使用了以前给出的每个答案中的一点:
- 我从connect mongodb切换到connect mongo模块
- 我使用一个通用conf对象来存储配置数据
- 有两个db连接,因为这对我来说更容易处理(如果/当新版本的mongoose/express出现时,可能会在以后更改)
要求:
var express = require('express'),
MongoStore = require('connect-mongo')(express),
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'
};
然后我可以这样配置它:
var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: 'myDb' })
}));
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”
对于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
已移动到它自己的模块,因此在配置mongostre
时,您需要require
它并使用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)
}));
如果链接到connect mongo,我在示例中使用了connect mongodb。但是它们几乎是一样的,所以我要检查一下。在连接到数据库之前,我正在app.configure()中使用express.session()。我想,我将定义一个包含所有DB信息的config对象,并尝试使用connect mongo(而不是connect mongodb)-实现看起来比connect mongodb简单github页面中的示例没有告诉如何使用mongoose。这个例子帮助很大。做得好!唯一一个让我的麻烦更加复杂的补充是,确保您的“app.use(app.router);”放在“app.use(express.session…”之后。对于最近试图实现此功能的任何人:似乎从v0.1.9开始,您需要将express设置为可变(var express=require('express')
)然后将其传递给connect mongo(var MongoStore=require('connect-mongo')(express)
)。这是因为express公开了connect的所有底层部分,而connect mongo实际上是一个以connect对象为参数的函数。为了避免EADDRINUSE错误,我必须删除“app.listen(3000)”从你的代码的底部开始,因为我已经在做我的。听其他地方。这部分只需要做一次,并且用于启动实际的express Web服务器本身——与mongodb连接本身无关。只是一个注释!好的,我一直到这里,但现在我如何与会话交互?设置并获取值es..@Hadesara这里有关于expressjs和会话的优秀文档:这可以拯救生命。互联网在这方面是错误的-结果顶部没有一个示例对此提出建议。非常感谢-这就解决了问题!感谢您的提示,但下次,请编辑我的答案并添加缺少的行,这样其他人就不会看到了不必阅读另一个答案…来自repomongoose session
,非活动。改用connect mongo。无论如何,这样更好。在第3行中,require语句之后的(session)到底是什么意思。它是否像(session)被传递给mongoStore一样