[英]Telling Mongoose which database to use - in a node.js Express application
我有一个 Node.js Express web 应用程序正在运行。
我有两个数据库连接,system_db 是用“Mongoose.connect”创建的,user_db 是用“Mongoose.createConnection”创建的。 这似乎使它们分开并具有不同的连接池。 虽然这可能是问题的症结所在。
我有处理 Mongoose model 的代码
在 model 文件中我有:
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 找到了一个团队 object:
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 function 没有为团队找到任何匹配项,即使它们存在于 user_db 数据库的集合中。 这意味着,我认为我的 model 不知何故指向了错误的数据库? 它必须以某种方式指向此 system_db 而不是 user_db。 这是对的吗? 我该如何解决?
下面的方法打开一个到system_db
的连接并绑定到mongoose
对象,即当前的 mongoose 对象被修改。 返回类型不是Connection
。
system_db = mongoose.connect(connection_uri.concat("sparks")...
现在当你再次这样做时:
user_db = mongoose.createConnection(connection_uri.concat(user_id));
这将创建一个到user
数据库的新Connection 并返回一个connection ,但不会修改mongoose
实例。 mongoose 实例仍然绑定到system_db
数据库连接。
由于 Team 模型是从同一个 mongoose 实例中获得的,
var Team = mongoose.model('teams',authSchema);
在这个model
上执行的任何操作都有效地发生在 mongoose 实例所持有的connection
中,即system_db
数据库的连接中。
所以你需要从user_db
连接中获取模型:
var user_db = mongoose.createConnection(..);
// retrieve the Team model
var Team= user_db.model('teams'); // not from mongoose instance.
在您想获得连接的任何地方使用createConnection
。
它正在建模多租户数据库,伙计们
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.