Должен ли я иметь слой между моим контроллером и моделью в приложении Node-Express? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение Express, где я использую Sequelize для взаимодействия с моей базой данных MySQL. Модели просто представляют таблицы базы данных с соответствующими полями, без какой-либо дополнительной логики. Я хочу, чтобы мои контроллеры не были полными, и для этого я думаю, что между ними должен быть слой, содержащий всю логику и использующий модель для взаимодействия с базой данных.

Это хорошая практика, и если это то, что я должен назвать этот слой и что именно он должен содержать?

Спасибо, заранее!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

Например, вы можете добавить что-то подобное в свою модель User:

instanceMethods: {

    encryptPassword: function(plainPassword) { 

        if(!this.salt){
            this.salt = randomString.generate(10);
        }

        var cipher = crypto.createCipher('aes-256-cbc', this.salt);
        cipher.update(plainPassword, 'utf8', 'base64');
        var encryptedPassword = cipher.final('base64')
        return encryptedPassword;
    },

    decryptPassword: function(){
        var decipher = crypto.createDecipher('aes-256-cbc', this.salt);
        decipher.update(this.password, 'base64', 'utf8');
        var decryptedPassword = decipher.final('utf8');
        return decryptedPassword;
    }
}

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

0 голосов
/ 15 мая 2018

Прежде всего, отличный вопрос.

Во-вторых, вот как я бы это сделал:

в ваших моделях, скажем, у вас есть модель пользователя users.js.

В этой модели для вашего интерфейса пользователя / БД после вашего

const User = module.exports = <sql declaration and model reference>;

вы можете создавать другие экспорты модулей, например:

module.exports.getUserById = function(id, callback){
    <Sequelize logic goes here>
};

И это по сути промежуточное программное обеспечение / контроллер для вашего класса модели для обработки подпрограмм.

Вы можете использовать это, импортировав вашу пользовательскую модель и затем вызвав экспортированный модуль:

const User = require("../models/users")

и затем, когда пришло время вызвать вашу функцию:

User.getUserById(id, function(err, user) {
    <some logic with regard to your user>
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...