猫鼬和多数据库在单节点.js项目

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

  • Mongoose不允许在单个猫鼬实例中使用多个数据库,因为这些模型是在一个连接上构建的。
  • 要使用多个猫鼬实例,Node.js 不允许使用多个模块实例,因为它在 中具有缓存系统。我知道在Node中禁用模块缓存.js但我认为这不是一个好的解决方案,因为它只需要猫鼬。require()

    我试图在猫鼬中使用和,但这不是解决方案。createConnection()openSet()

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

我想知道是否无论如何都要使用具有猫鼬的多个数据库或此问题的任何解决方法?因为我认为猫鼬很容易和快速。还是任何其他模块作为建议?


答案 1

根据精细手册可用于连接多个数据库。createConnection()

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

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' }
}));

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


答案 2

很晚了,但这可能会帮助某人。当前答案假定您为连接和模型使用相同的文件。

在现实生活中,您很有可能会将模型拆分为不同的文件。您可以在主文件中使用类似下面的内容:

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 是您的数据库名称。