Мангуста и несколько баз данных в одном узле.проект js
Я делаю узел.проект JS, которая содержит вложенные проекты. Один подпроект будет иметь одну базу данных Mongodb, а Мангуст будет использоваться для обертывания и запроса БД. Но проблема в том
- Мангуст не позволяет использовать несколько баз данных в одном экземпляре мангуста, поскольку модели строятся на одном соединении.
использовать несколько экземпляров мангуста, узел.js не допускает несколько экземпляров модуля, поскольку он имеет систему кэширования в
require(). Я знаю, что отключить кэширование модуля в узле.js но я думаю, что это не хорошее решение, так как это нужно только для мангуста.
Я пытался использовать
createConnection()иopenSet()в мангусте, но это не было решением.
Я попытался глубоко скопировать экземпляр мангуста (http://blog.imaginea.com/deep-copy-in-javascript/) чтобы передать новые экземпляры Мангуста в подпроект, но он бросает
RangeError: Maximum call stack size exceeded.
Я хочу знать, есть в любом случае использовать несколько база данных с Мангустом или любым обходным путем для этой проблемы? Потому что я думаю, что Мангуст довольно легко и быстро. Или любые другие модули в качестве рекомендаций?
4 ответов:
одна вещь, которую вы можете сделать, это то, что у вас могут быть подпапки для каждого проекта. Итак, установите Мангуста в эти подпапки и требуйте() мангуста из собственных папок в каждом подпапке приложения. Не из корня проекта или из глобального. Итак, один подпроект, одна установка мангуста и один экземпляр мангуста.
-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()можете используется для подключения к нескольким базам данных.однако, вам нужно создать отдельные модели для каждого соединения / базы данных:
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-это ваша база данных имя.
Comments