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

时间:2018-05-15 16:19:33

标签: mysql node.js express model-view-controller sequelize.js

我有一个Express应用程序,我使用Sequelize与我的MySQL数据库进行交互。模型只表示具有相应字段的数据库表,不包含任何其他逻辑。我希望我的控制器不会变胖,为此我认为我应该在其间包含所有逻辑并使用模型与数据库交互的层。

这是一个很好的做法吗?如果我应该将这个图层称为什么,它应该包含什么?

先谢谢!

2 个答案:

答案 0 :(得分:1)

首先,很好的问题。

其次,我就是这样做的:

在你的模型中,假设你有一个用户模型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>
});

答案 1 :(得分:0)

您可以使用方法和钩子扩展续集模型和实例,理想情况下,您的控制器只会调用这些方法。

例如,您可以将这样的内容添加到您的用户模型中:

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

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