我使用Node.Js 8.6和Mongoose 4.11并且有多个数据库连接。通过mongoose.createConnection
建立Db连接。
我发现mongoose
对象有connections
属性(数组),在那里我可以看到已建立的连接。我的问题是,在单独的模块中创建数据库模型时,在连接之间切换的正确方法是什么。
index.js
async function db1() {
await mongoose.createConnection(
process.env.MONGODB_URI_1,
{ useMongoClient: true }
);
}
async function db2() {
await mongoose.createConnection(
process.env.MONGODB_URI_2,
{ useMongoClient: true }
);
}
model.js
//connect to db1
const Test1 = mongoose.model('Test1', new mongoose.Schema({ name: String }));
//connect to db2
const Test2 = mongoose.model('Test2', new mongoose.Schema({ name: String }));
答案 0 :(得分:0)
您可以使用createConnection
返回的对象来处理多个连接。
const db1Link = await mongoose.createConnection(
process.env.MONGODB_URI_1,
{ useMongoClient: true }
);
// Connect to db1
db1Link.model('Test1', new mongoose.Schema({ name: String }));
const db2Link = await mongoose.createConnection(
process.env.MONGODB_URI_2,
{ useMongoClient: true }
);
// Connect to db2
db2Link.model('Test2', new mongoose.Schema({ name: String }));
Here is what the documentation says about it
多个连接
到目前为止,我们已经看到了如何使用Mongoose的默认连接到MongoDB 连接。有时我们可能需要多个连接打开Mongo, 每个都有不同的读/写设置,或者可能只是不同的 数据库例如。在这些情况下,我们可以利用 mongoose.createConnection()接受所有参数 讨论并为您返回一个新的连接。
var conn = mongoose.createConnection('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', options);
然后使用此连接对象创建和检索模型。 模型始终作用于单个连接。
答案 1 :(得分:0)
// config.json
{
"Tenants": {
"5c061f432c9e9e499325b": {
"dbConfig": "mongodb://admin:Password@IP/DBname",
"dbName": "DBname",
},
"5c0432ebabb6c9e9e499325b": {
"dbConfig": "mongodb://admin:Password@IP/DBname",
"dbName": "DBname",
},
"5c061f43bb6c9e9e499325b": {
"dbConfig": "mongodb://admin:Password@IP/DBname",
"dbName": "DBname",
}
},
}
// ModelFactory.js
var mongoose = require("mongoose");
var models = [];
var conns = [];
var path = __dirname + "\\models";
var config = require("config");
function factory(tenant) {
let dbName = config.get("Tenants." + tenant + ".dbName");
let dbConnection = config.ge`enter code here`t("Tenants." + tenant + ".dbConfig");
if (conns[dbName]) {
} else {
conns[dbName] = mongoose.createConnection(dbConnection);
}
if (models[dbName]) {
} else {
var instanceModels = [];
var schemas = ["users","products"];
schemas.forEach(function (models) {
instanceModels[models] = conns[dbName].model(models, require([path, models].join("\\")));
});
// DB name and tenant ID also pushing in the same object
//instanceModels["tenantID"] = tenant;
//instanceModels["db"] = conns[dbName];
models[dbName] = instanceModels;
}
return models[dbName];
}
module.exports = factory;
// API端点
exports.users = function (req, res) {
var models = modelFactory(req.headers.tenantid);
models.User.find() //query