Mysql 在Node Express应用程序中,我的控制器和模型之间是否应该有一个层?

Mysql 在Node Express应用程序中,我的控制器和模型之间是否应该有一个层?,mysql,node.js,express,model-view-controller,sequelize.js,Mysql,Node.js,Express,Model View Controller,Sequelize.js,我有一个Express应用程序,使用Sequelize与MySQL数据库交互。这些模型只是用相应的字段表示数据库表,不包含任何附加逻辑。我希望我的控制器不要太胖,为此,我认为我应该在中间有一个层,它包含所有的逻辑,并使用模型与数据库交互 这是一个好的实践吗?如果是,我应该称这个层为什么,它应该包含什么 提前谢谢 首先,好问题 其次,我会这样做: 在模型中,假设您有一个用户模型users.js 在用户/db界面的模型中 const User=module.exports= 您可以创建其他模块导出,

我有一个Express应用程序,使用Sequelize与MySQL数据库交互。这些模型只是用相应的字段表示数据库表,不包含任何附加逻辑。我希望我的控制器不要太胖,为此,我认为我应该在中间有一个层,它包含所有的逻辑,并使用模型与数据库交互

这是一个好的实践吗?如果是,我应该称这个层为什么,它应该包含什么


提前谢谢

首先,好问题

其次,我会这样做:

在模型中,假设您有一个用户模型users.js

在用户/db界面的模型中

const User=module.exports=

您可以创建其他模块导出,如下所示:

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

您可以使用方法和挂钩扩展sequelize模型和实例,理想情况下,您的控制器只需对这些方法进行一些调用

例如,您可以向您的用户模型中添加如下内容:

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;
    }
}
甚至可能添加一个预保存钩子来检查用户是否是新用户,然后在保存之前加密密码,您可以创建身份验证方法,从您的模型而不是控制器调用此方法,等等

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;
    }
}