Session node.js+;express.js:mongodb/mongoose的会话处理

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

现在,我将会话数据存储在“内存存储”中,它与connect(express)捆绑在一起。但我想/必须为生产改变这一点

应用程序使用mongodb,我安装了mongoose来处理所有db通信

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' })
}));
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和会话的优秀文档:这可以拯救生命。互联网在这方面是错误的-结果顶部没有一个示例对此提出建议。非常感谢-这就解决了问题!感谢您的提示,但下次,请编辑我的答案并添加缺少的行,这样其他人就不会看到了不必阅读另一个答案…来自repo
mongoose session
,非活动。改用connect mongo。无论如何,这样更好。在第3行中,require语句之后的(session)到底是什么意思。它是否像(session)被传递给mongoStore一样