3

当我尝试使用 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

我也尝试按照许多文章所说的去做。这是某人工作配置的示例(在 ExpressJS、PassportJS 和 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 配置?

4

1 回答 1

2

问题是机车启动的顺序。根据文档

启动机车应用程序时,它会执行一系列步骤:

配置环境

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

调用初始化器

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

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

于 2013-11-06T18:52:18.577 回答