首页 文章

单节点.js项目中的Mongoose和多个数据库

提问于
浏览
97

我正在做一个包含子项目的Node.js项目 . 一个子项目将有一个Mongodb数据库,Mongoose将用于包装和查询db . 但问题是

  • Mongoose不允许在单个mongoose实例中使用多个数据库,因为模型是在一个连接上构建的 .

  • 要使用多个mongoose实例,Node.js不允许多个模块实例,因为它在 require() 中具有缓存系统 . 我知道在Node.js中禁用模块缓存,但我认为这不是一个好的解决方案,因为它只需要mongoose .

我曾尝试在mongoose中使用 createConnection()openSet() ,但这不是解决方案 .

我试图深度复制mongoose实例(http://blog.imaginea.com/deep-copy-in-javascript/)以将新的mongoose实例传递给子项目,但它抛出 RangeError: Maximum call stack size exceeded .

我想知道是否有使用多个数据库与mongoose或任何解决方法来解决这个问题?因为我认为猫鼬非常容易和快速 . 或任何其他模块作为建议?

4 回答

  • 23

    您可以做的一件事是,您可能拥有每个项目的子文件夹 . 因此,在子文件夹中安装mongoose,并在每个子应用程序中从自己的文件夹中安装require()mongoose . 不是来自项目根目录或来自全局 . 所以一个子项目,一个mongoose安装和一个mongoose实例 .

    -app_root/
    --foo_app/
    ---db_access.js
    ---foo_db_connect.js
    ---node_modules/
    ----mongoose/
    --bar_app/
    ---db_access.js
    ---bar_db_connect.js
    ---node_modules/
    ----mongoose/
    

    在foo_db_connect.js中

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/foo_db');
    module.exports = exports = mongoose;
    

    在bar_db_connect.js中

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/bar_db');
    module.exports = exports = mongoose;
    

    在db_access.js文件中

    var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app
    

    现在,您可以使用mongoose访问多个数据库 .

  • 32

    根据the fine manualcreateConnection() 可用于连接多个数据库 .

    但是,您需要为每个连接/数据库创建单独的模型:

    var conn      = mongoose.createConnection('mongodb://localhost/testA');
    var conn2     = mongoose.createConnection('mongodb://localhost/testB');
    
    // stored in 'testA' database
    var ModelA    = conn.model('Model', new mongoose.Schema({
      title : { type : String, default : 'model in testA database' }
    }));
    
    // stored in 'testB' database
    var ModelB    = conn2.model('Model', new mongoose.Schema({
      title : { type : String, default : 'model in testB database' }
    }));
    

    我很确定你可以在它们之间共享架构,但你必须检查以确保它 .

  • 16

    作为替代方法,Mongoose会在默认实例上为新实例导出构造函数 . 所以这样的事情是可能的 .

    var Mongoose = require('mongoose').Mongoose;
    
    var instance1 = new Mongoose();
    instance1.connect('foo');
    
    var instance2 = new Mongoose();
    instance2.connect('bar');
    

    这在处理单独的数据源时非常有用,并且当您希望为每个用户或请求创建单独的数据库上下文时也是如此 . 您需要小心,因为在执行此操作时可能会创建大量连接 . 确保在不需要实例时调用disconnect(),并限制每个实例创建的池大小 .

  • 172

    很晚但这可能对某人有所帮助 . 当前答案假定您使用相同的文件作为连接和模型 .

    在现实生活中,很有可能将模型分成不同的文件 . 你可以在主文件中使用这样的东西:

    mongoose.connect('mongodb://localhost/default');
    
    const db = mongoose.connection;
    
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', () => {
      console.log('connected');
    });
    

    这就是文档中描述的内容 . 然后在您的模型文件中,执行以下操作:

    import mongoose, { Schema } from 'mongoose';
    
    const userInfoSchema = new Schema({
      createdAt: {
        type: Date,
        required: true,
        default: new Date(),
      },
      // ...other fields
    });
    
    const myDB = mongoose.connection.useDb('myDB');
    
    const UserInfo = myDB.model('userInfo', userInfoSchema);
    
    export default UserInfo;
    

    myDB是您的数据库名称 .

相关问题