Подтвердить что ты не робот

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

Я выполняю проект Node.js, содержащий вспомогательные проекты. В одном субпроекте будет одна база данных Mongodb, а Mongoose будет использоваться для обертывания и запроса db. Но проблема в том, что

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

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

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

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

4b9b3361

Ответ 1

Одна вещь, которую вы можете сделать, - это иметь подпапки для каждого проекта. Таким образом, установите 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('./node_modules/mongoose');
mongoose.connect('mongodb://localhost/foo_db');
module.exports = exports = mongoose;

В bar_db_connect.js

var mongoose = require('./node_modules/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.

Ответ 2

Согласно точное руководство, 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' }
}));

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

Ответ 3

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

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

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

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

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