Мангуста и несколько баз данных в одном узле.проект js

Я делаю узел.проект js, содержащий подпроекты. Один подпроект будет иметь одну базу данных Mongodb, а Мангуст будет использоваться для упаковки и запроса БД. Но проблема в том

  • Мангуст не позволяет использовать несколько баз данных в одном экземпляре мангуста, поскольку модели построены на одном соединении.
  • использовать несколько экземпляров мангуста, узел.js не разрешает несколько экземпляров модуля, так как имеет систему кэширования в require(). Я знаю, что отключить кэширование модуля в узле.js, но я думаю, что это не хорошее решение, так как это нужно только для мангуста.

    Я пытался использовать createConnection() и openSet() в мангусте, но это не было решением.

    Я попытался глубоко скопировать экземпляр мангуста (http://blog.imaginea.com/deep-copy-in-javascript/) передать новые экземпляры Мангуста в подпроект, но это бросание RangeError: Maximum call stack size exceeded.

Я хочу знать, есть в любом случае использовать несколько база данных с Мангустом или любым обходным путем для этой проблемы? Потому что я думаю, что Мангуст довольно легко и быстро. Или любые другие модули в качестве рекомендаций?

4 ответов


одна вещь, которую вы можете сделать, это то, что у вас могут быть вложенные папки для каждого проекта. Таким образом, установите Мангуст в этих подпапках и require() Мангуст из собственных папок в каждом вложенном приложении. Не из корня проекта или из global. Итак, один подпроект, одна установка мангуста и один экземпляр мангуста.

-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

теперь, вы можете получить доступ к несколько баз данных с Мангустом.


по данным документацию, createConnection() can используется для подключения к нескольким базам данных.

однако вам нужно создать отдельные модели для каждого соединения / базы данных:

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

Я уверен, что вы можете поделиться схемы между ними, но вы должны проверить, чтобы убедиться.


в качестве альтернативного подхода Мангуст экспортирует конструктор для нового экземпляра на экземпляре по умолчанию. Так что нечто подобное возможно.

var Mongoose = require('mongoose').Mongoose;

var instance1 = new Mongoose();
instance1.connect('foo');

var instance2 = new Mongoose();
instance2.connect('bar');

Это очень полезно при работе с отдельными источниками данных, а также, если вы хотите иметь отдельный контекст базы данных для каждого пользователя или запрос. Вам нужно будет быть осторожным, так как при этом можно создать много соединений. Не забудьте вызвать disconnect (), когда экземпляры не нужны, а также ограничить размер пула, создаваемого каждым экземпляром.


довольно поздно, но это может помочь кому-то. Текущие ответы предполагают, что вы используете один и тот же файл для своих подключений и моделей.

в реальной жизни существует высокая вероятность того, что вы разделяете свои модели на разные файлы. Вы можете использовать что-то подобное в своем основном файле:

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-ваша база данных имя.