在node express应用程序中,我的控制器和模型之间应该有一个层吗?

qxsslcnc  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(283)

我有一个express应用程序,我使用sequelize与mysql数据库进行交互。这些模型只是用相应的字段表示数据库表,不包含任何附加逻辑。我希望我的控制器不会太胖,因此我认为应该在控制器之间设置一个层,该层包含所有逻辑,并使用模型与数据库进行交互。
这是一个好的做法,如果它是我应该称之为这个层,它到底应该包含什么?
提前谢谢!

qf9go6mv

qf9go6mv1#

您可以使用方法和钩子扩展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;
    }
}

甚至可以添加一个预保存钩子来检查用户是否是新的,然后在保存之前加密密码,您可以创建身份验证方法来从您的模型而不是控制器调用这个,等等。。。

3zwtqj6y

3zwtqj6y2#

首先,好问题。
其次,我会这样做:
在您的模型中,假设您有一个用户模型users.js。
在用户/db界面的模型中 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>
});

相关问题