【问题标题】:Mongoose switching multiple connections猫鼬切换多个连接
【发布时间】:2017-10-05 08:36:52
【问题描述】:

我正在使用 Node.Js 8.6 和 Mongoose 4.11,并且有多个数据库连接。数据库连接是通过mongoose.createConnection 建立的。 我发现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 }));

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您可以使用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);
    

    然后使用此连接对象来创建和检索模型。 模型始终限定为单个连接。

    【讨论】:

    • 确实如此。在模块周围共享这些连接对象的优雅方式是什么?
    【解决方案2】:

    //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
    

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多