Я создаю приложение (MVC), которое будет использовать 4 коллекции в БД.Когда я добавляю новых клиентов в приложение, они получают отдельную БД.Поэтому, если у меня будет 10 клиентов, будет 10 БД и 40 коллекций (1 дБ -> 4 коллекции)
Таким образом, данные каждого клиента отделены от других клиентов, что крайне важно здесь.
Пока что я создал приложение, и все работает хорошо, кроме одной вещи.
Если компания A входит в систему и начинает использовать приложение, все работает нормально.Но когда компания A вошла в систему, а компания B вошла в систему, обе компании A и B будут направлены в базу данных компании B: s.
Я просмотрел свой код и, думаю, это моя вина, потому что я использую .connect (mongoose).Когда компания регистрируется на маршруте, будет запущен контроллер, который откроет новое соединение (которое переопределяет старое), которое перенаправит все открытые соединения в эту конкретную БД.
controller.dBlogin.js
mongoose.connect(dbConfig.url + id, options)
.then(() => {
console.log("Successfully connected to the database");
next();
}).catch(err => {
console.log('Could not connect to the database. Exiting now...');
process.exit();
});
id извлекается из req.params.id (пример: http://webapp.com/login/:id).
Насколько я понял, .connect допускает только одно соединение в данный момент времени, поэтому мне нужно что-то, что просто разрешит много соединений. Поэтому я думаю, что я мог бы использовать .createConnection для этого,
Но я просто не могу заставить его работать.
Я изменил controller.dBlogin.js до
mongoose.createConnection(dbConfig.url + id, options)
.then(() => {
console.log("Successfully connected to the database");
next();
}).catch(err => {
console.log('Could not connect to the database. Exiting now...');
process.exit();
});
, но это приводит только к таймауту, когда компания входит в систему. Как использовать .createConnections? Как перейти от .connect к .createConnection?
Вот примеры маршрутов, контроллера и модели (пользовательская схема).
rout.js
// connect to db, check auth
app.post('/login/:id', dbController.connectDB, dbController.login)
контроллер.dbLogin.js
exports.**connectDB** = (req, res, next) => {
const id = req.params.id;
// Get Mongoose to use the global promise library
mongoose.Promise = global.Promise;
// Options Conncetion mongodb
const options = {
useNewUrlParser: true,
};
// Connecting to the database
mongoose.connect(dbConfig.url + id, options)
.then(() => {
console.log("Successfully connected to the database");
next();
}).catch(err => {
console.log('Could not connect to the database. Exiting now...');
process.exit();
});
};
exports.login = (req, res, next) => {
passport.authenticate('local-login', {
successRedirect: '/start', // redirect to the secure profile section
failureRedirect: '/login', // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
})(req, res, next);
};
Пример модели user.js
const mongoose = require('mongoose');
const bcrypt = require('bcrypt-nodejs');
const Company = require('../models/company.js');
// define the schema for our user model
const userSchema = mongoose.Schema({
local : {
name : {
type: String,
required : true
},
email : {
type : String,
unique : true,
required : true
},
password : String,
active : Boolean,
company : {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
}
});
// generating a hash for password
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.local.password);
};
// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);