Mongoose切换多个连接

时间:2017-10-05 08:36:53

标签: javascript node.js mongodb express mongoose

我使用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 }));

2 个答案:

答案 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