现在,我将会话数据存储在与Connect(Express)捆绑在一起的“内存商店”中。但是我想/必须更改此产品以进行生产。

该应用程序正在使用MongoDB,我安装了Mongoose来处理所有DB通信。

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

var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
  app.listen(3000);
}

我找到了连接mongodb模块,但是我不知道如何使用猫鼬实施它,还是实际上可能是可能的?我需要添加类似的东西:

var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: 'myDb' })
}));

还是我必须直接使用MongoDB模块第二次定义DB连接?

有帮助吗?

解决方案

最后,我使用以前给出的所有答案:

  • 我从Connect-MongoDB切换到Connect Mongo模块
  • 我正在使用一般的conf对象来存储我的配置数据
  • 有两个DB连接,因为它更容易为我处理(以后可能会更改,如果/当新版本的Mongoose/Express出现时)

要求:

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'
};

然后,我可以这样进行配置:

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:

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-mongodb 假设上面的猫鼬连接代码较早运行:

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 司机 (IE: npm install mongodb)。猫鼬也取决于这个驱动程序,因此应该存在。

看着 代码直接, ,您必须提供DB连接信息作为 MongoStore 目的:

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

通常,您需要拥有一些可以动态加载的“配置”对象或变量(开发vs vs vs vs vs vs prod)。然后,将host/port/db/auth从该配置对象中删除。

对于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 已移至其自己的模块,因此您需要 require 它并使用 session 配置时 MongoStore.

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

您也可以通过诸如mongodb:// user:pass@host.com/db_name之类的连接URL传递。

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

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

我敢肯定,如果您等待下一个版本,您将能够通过现有的Mongoose连接。同时,您只需要接受两个连接,一个来自Mongoose,一个来自Connect-MongoDB。

我从中获得了连接信息 https://github.com/tedeh/connect-mongodb 我从查看来源获得了处理信息(相关承诺).

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

非常轻巧,为我无缝工作。来自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)
}));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top