使用connect-mongo和mongoose在mongodb中存储会话

时间:2013-11-06 18:25:00

标签: node.js mongodb express mongoose locomotivejs

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

在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 docs那样说,但我也遇到了错误。 (https://github.com/kcbanner/connect-mongo)mongoose_connection格式为:someMongooseDb.connections [0]以使用现有的mongoose连接。 (可选)

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配置?

1 个答案:

答案 0 :(得分:2)

问题是机车启动的顺序。根据{{​​3}}:

  

启动机车应用程序时,它会继续执行   步骤顺序:

     

配置环境

     

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

     

调用初始值设定项

     

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

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