Я создаю мультитенантное приложение Saas. Многие посоветовали мне держать своих отдельных клиентов в отдельных базах данных, чтобы повысить безопасность и упростить управление.
Как нам подключить несколько баз данных к приложению Node?
Я знаю, как заставить мое приложение работать с одним подключением базы данных к mongodb, но не уверен насчет нескольких подключений.
Документ mon goose упоминает следующие решения для нескольких соединений:
- шаблон схемы экспорта (https://mongoosejs.com/docs/connections.html#multiple_connections) * соединение 1013 *
- пулы (у которых есть только до 5 подключений, которые могут быть не идеальными, поскольку в будущем у меня могут быть сотни клиентов)
Другой способ, который я пробовал (и он работает!), это подключение к mongodb во время вызова API узла и выполнения моей логики c, как показано ниже. Код ниже представляет собой тестовый маршрут для регистрации пользователя с именем и адресом электронной почты. dbutils () - это функция, которую я вызываю для подключения к mongodb, используя mon goose .connect (). Я не уверен, если это хорошая практика для подключения во время вызова API.
router.post('/:db/register', async (req,res, next) => {
const startTime = new Date();
try {
if(!req.body.name) {
throw new Error("Name required");
}
if(!req.body.email) {
throw new Error("Email required");
}
await dbutils(req.params.db);// connect to db
const session = await mongoose.startSession();
session.startTransaction();
const newUser = new User({
name: req.body.name,
email: req.body.email,
})
await newUser.save({session});
await session.commitTransaction();
session.endSession();
const endTime = new Date();
const diff = endTime.getTime() - startTime.getTime();
return res.json({
newUser: {
email: req.body.email,
name: req.body.name
},
db: req.params.db,
timeElapsed: diff,
});
} catch(ex) {
return next(ex);
}
})
Мой код dbutils ()
const mongoose = require('mongoose');
const mongoURI = "mongodb://PC:27017,PC:27018,PC:27019";
module.exports = async function(db) {
try {
await mongoose.connect(
`${mongoURI}/${db}`,
{
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true,
}
)
} catch(ex) {
throw ex
}
}
Я был бы очень рад любой рекомендации или решению этой проблемы. Заранее большое спасибо за ваш ответ.