我有一个express应用程序,我使用sequelize与mysql数据库进行交互。这些模型只是用相应的字段表示数据库表,不包含任何附加逻辑。我希望我的控制器不会太胖,因此我认为应该在控制器之间设置一个层,该层包含所有逻辑,并使用模型与数据库进行交互。这是一个好的做法,如果它是我应该称之为这个层,它到底应该包含什么?提前谢谢!
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; } }
甚至可以添加一个预保存钩子来检查用户是否是新的,然后在保存之前加密密码,您可以创建身份验证方法来从您的模型而不是控制器调用这个,等等。。。
3zwtqj6y2#
首先,好问题。其次,我会这样做:在您的模型中,假设您有一个用户模型users.js。在用户/db界面的模型中 const User = module.exports = <sql declaration and model reference>; 您可以像这样创建其他模块导出:
const User = module.exports = <sql declaration and model reference>;
module.exports.getUserById = function(id, callback){ <Sequelize logic goes here> };
这本质上是用于处理例程的模型类的中间件/控制器。您可以通过导入用户模型,然后调用导出的模块来使用它: const User = require("../models/users") 当调用函数时:
const User = require("../models/users")
User.getUserById(id, function(err, user) { <some logic with regard to your user> });
2条答案
按热度按时间qf9go6mv1#
您可以使用方法和钩子扩展sequelize模型和示例,理想情况下,您的控制器只需对这些方法进行一些调用。
例如,您可以向您的用户模型中添加以下内容:
甚至可以添加一个预保存钩子来检查用户是否是新的,然后在保存之前加密密码,您可以创建身份验证方法来从您的模型而不是控制器调用这个,等等。。。
3zwtqj6y2#
首先,好问题。
其次,我会这样做:
在您的模型中,假设您有一个用户模型users.js。
在用户/db界面的模型中
const User = module.exports = <sql declaration and model reference>;
您可以像这样创建其他模块导出:这本质上是用于处理例程的模型类的中间件/控制器。
您可以通过导入用户模型,然后调用导出的模块来使用它:
const User = require("../models/users")
当调用函数时: