告诉Mongoose使用哪个数据库 - 在node.js Express应用程序中

时间:2014-11-19 22:30:03

标签: node.js express mongoose

我正在运行Node.js Express网络应用。

我有两个数据库连接,system_db使用“Mongoose.connect”创建,user_db使用“Mongoose.createConnection”创建。这似乎使它们分离并具有不同的连接池。虽然这可能是问题的症结所在。

我有处理Mongoose模型的代码

我在模型文件中

var authSchema = mongoose.Schema({
    teamName: String,
    league: String,
    players: []

});


var Team = module.exports = mongoose.model('teams',authSchema);

在我的主文件中,我有两个连接:

一个是系统数据库

connection_uri = "mongodb://localhost:27017/";
system_db = mongoose.connect(connection_uri.concat("sparks"), {
    native_parser : true
}, function(err){
    if (err) throw err;
});

另一个是用户数据库

 user_db = mongoose.createConnection(connection_uri.concat(user_id));

然后我在我的主文件中有这段代码,它找到一个基于id的Team对象:

app.param('team_id', function(req, res, next, team_id) {

    Team.findOne(team_id, function(err, team) {

        if (err) {
            return next(err);
        }
        if (!team) {
            throw new Error("no team matched");
        }
        req.team = team;
        next();
    });
});

问题是上面的app.param函数没有为团队找到任何匹配,即使它们存在于user_db数据库的集合中。这意味着,我认为我的模型以某种方式指向错误的数据库?不知何故,它必须指向此system_db而不是user_db。这可能是对的吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

以下方法打开与system_db的连接,并绑定到mongoose对象,.i.e当前的mongoose对象被修改。返回类型为 a Connection

system_db = mongoose.connect(connection_uri.concat("sparks")...

现在当你再次这样做时:

user_db = mongoose.createConnection(connection_uri.concat(user_id));

这会创建与user数据库的连接并返回连接,但不会修改mongoose实例。 mongoose实例仍绑定到system_db数据库连接。

由于团队模型是从同一个猫鼬实例获得的,

var Team = mongoose.model('teams',authSchema);

在此model上执行的任何操作都有效地发生在mongoose实例所拥有的connection中,并且是system_db数据库中的。{/ p>

所以你需要从user_db连接中获取模型:

var user_db = mongoose.createConnection(..);
// retrieve the Team model
var Team= user_db.model('teams'); // not from mongoose instance.

在您想要获取连接的任何地方使用createConnection