Один экземпляр mongoDB, много БД - как подключить пользователя к «своей» БД, не влияя на других пользователей? - PullRequest
0 голосов
/ 30 декабря 2018

Я создаю приложение (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);

1 Ответ

0 голосов
/ 04 января 2019

Итак, для тех, кто оказался в одном месте:

После просмотра моего приложения и данных, которые оно сохранит, я пришел к выводу, что нет необходимости разделять многопользовательский режим.Я переработал приложение так, чтобы когда пользователь выбирал или записывал данные, они касались только «своих» данных, и это контролировалось бэкендом.

Но я сделал пост на mongoose github и получил ответ,

Смотрите пост здесь: https://github.com/Automattic/mongoose/issues/7386

Автор дал большую длину, которая, кажется, имеетна самом деле довольно хорошая реализация этого с помощью express и mongoose: http://nmajor.com/posts/multi-tenancy-with-expressmongoose

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

Приветствия.

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