【问题标题】:Store sessions in mongodb with connect-mongo and mongoose使用 connect-mongo 和 mongoose 在 mongodb 中存储会话
【发布时间】:2013-11-07 02:52:18
【问题描述】:

当我尝试使用 mongodb 配置 express.js 会话存储时,我遇到了左右错误。我正在为我的框架使用机车并配置了猫鼬。

在我的 02_mongoose.js 的初始化程序目录中,我有这个。

module.exports = function() {
    mongoose.connect('mongodb://localhost:27018/basbac');
    mongoose.model('User', UserSchema);
}

我知道我已经连接到数据库,因为我可以将我的用户拉到我的控制器中。

DeveloperController.show = function() {

var self = this;
var user = mongoose.model('User');

user.find().exec(function(error, users) {

    if(error) {
        console.log(error);
    } else {
        self.res.json({response: { id: self.param('id'), api: self.param('api'), users: users } });    
    }

});

}

http://localhost:3000/developer/test/?api=hhfkgjhukdsfkjhvsduhvudhcsiudvlskejfbk

{
  response: {
  id: "test",
  api: "hhfkgjhukdsfkjhvsduhvudhcsiudvlskejfbk",
  users: [
    {
      _id: "52706695a43c83a739358de5",
      firstname: "cad",
      lastname: "bane",
      address: "duro",
      email: "cad@bane.com"
    },
    {
      _id: "52706695a43c83a739358de6",
      firstname: "jar jar",
      lastname: "binks",
      address: "naboo",
      email: "jarjar@binks.com"
    }
   ]
   }
}

在我的 config/all.js 中,我将其作为会话配置

var MongoStore = require('connect-mongo')(express);
var mongoose = require('mongoose');

this.use(express.cookieParser());

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        mongoose_connection: mongoose.connection
    }) 
}));

但这会引发错误。

this.db = new mongo.Db(options.mongoose_connection.db.databaseName,
TypeError: Cannot read property 'databaseName' of undefined

我也尝试像 connect-mongo 文档中所说的那样做,但我也遇到了错误。 (https://github.com/kcbanner/connect-mongo) mongoose_connection 的形式:someMongooseDb.connections[0] 使用现有的猫鼬连接。 (可选)

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        mongoose_connection: mongoose.connections[0]
    }) 
}));

但是我得到了和以前一样的错误。

this.db = new mongo.Db(options.mongoose_connection.db.databaseName,
TypeError: Cannot read property 'databaseName' of undefined

我也尝试按照许多文章所说的去做。这是某人工作配置的示例(Logout in ExpressJS, PassportJS and MongoStore

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        db: mongoose.connection.db
    }) 
}));

但这也会产生错误,我知道 db 键实际上是未定义的

throw new Error('Required MongoStore option `db` missing');

将此连接传递到新的 MongoStore 中我做错了什么?当我启动console.log() mongoose 对象时,我无法找到有关它正在使用的连接的任何信息。我确实看到了一个基础对象,但它里面没有 db 键。我是否需要将更多选项传递给 mongoose 配置?

【问题讨论】:

    标签: node.js mongodb express mongoose locomotivejs


    【解决方案1】:

    问题在于机车启动的顺序。根据the docs

    当一个机车应用程序启动时,它会通过一个 步骤顺序:

    配置环境

    在这一步中,config/environments/all.js 被执行,然后是 当前环境的配置文件。例如,当 在开发中运行, config/environments/development.js 是 执行。

    调用初始化器

    配置环境后,将调用初始化程序。 初始化器用于配置子系统并连接到 数据库、消息队列和其他服务 应用。

    因此,当您的环境代码被调用时,初始化程序尚未运行且 Mongoose 未配置。尝试将 Mongoose 设置移动到一个单独的文件(我自己使用 app/db/mongoose,但这是个人喜好问题)和 require 在您的环境文件中。

    【讨论】:

    • 谢谢它的工作,我应该注意到订单不合适。在我所有的搜索中,我什至没有想到这一点。
    • @lumberjacked 我实际上必须检查自己,因为对我来说,在环境文件之前运行初始化程序会更有意义:)
    • 我同意,因为当这样的配置需要事先运行时,它违背了拥有开发/生产环境的目的。我最终复制了我的代码,因为我想使用环境文件。所以现在连接和会话都在重复,我不喜欢那样。
    • @lumberjacked 根据您的需要,您可以使用类似于此的内容:gist。或者您可以使用 mongoose.createConnection 为您的会话存储创建一个特定的新连接。
    • 这是一个很好的解决方案,它消除了重复。对于我的应用程序,我稍微更改了它并使用了“初始化 Mongoose 和 MongoDB”(locomotivejs.org/guide/initialization) 中的 switch 语句,但将 mongoose.js 文件移到了环境目录中。
    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2018-12-13
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多