我正在运行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。这可能是对的吗?我该如何解决这个问题?
答案 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
。