38

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

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

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

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 再次定义我的数据库连接?

4

7 回答 7

42

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

  • 我从 connect-mongodb 切换到 connect-mongo 模块
  • 我正在使用通用 conf 对象来存储我的配置数据
  • 有两个数据库连接,因为它对我来说更容易处理(以后可能会更改,如果/当新版本的 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'
};

然后我可以像这样配置它:

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);
});
于 2011-07-26T15:07:07.617 回答
27

请包括

app.use(express.cookieParser());

直接在之前

app.use(express.session({

否则抛出如下错误,

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

于 2011-09-05T09:29:42.063 回答
7

connect-mongodb假设上面的 mongoose 连接代码运行较早,您似乎可以执行此操作:

app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: mongoose.connections[0].db })
}));
于 2011-07-25T18:11:34.277 回答
3

所以connect-mongodb不使用猫鼬,它使用node-mongodb-native驱动程序( npm install mongodb:) 。Mongoose 也依赖于这个驱动程序,所以它应该存在。

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

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

通常为此,您需要一些可以动态加载的“配置”对象或变量(开发、测试和产品)。然后,您将主机/端口/db/auth 从该配置对象中拉出。

于 2011-07-25T18:03:03.293 回答
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已移至其自己的模块,因此您需要requiresession配置MongoStore.

于 2014-07-02T23:16:31.697 回答
1

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

你也可以传入一个连接 url,比如 mongodb://user:pass@host.com/db_name。

这两种方法都将自动启动新连接,无论您是否已经拥有或将要启动 mongoose 连接。

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

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

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

于 2011-07-25T22:15:30.207 回答
0

我只是偶然发现了猫鼬会话

非常轻巧,可以无缝地为我工作。从知乎...

安装

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)
}));
于 2014-07-04T13:01:11.893 回答