方法应该在"选项"参数中提供sequelize.define
const bcrypt = require("bcrypt"); module.exports = function(sequelize, DataTypes) { const User = sequelize.define('users', { annotation_id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, firstName: { type: DataTypes.DATE, field: 'first_name' }, lastName: { type: DataTypes.DATE, field: 'last_name' }, email: DataTypes.STRING, password: DataTypes.STRING }, { freezeTableName: true, instanceMethods: { generateHash(password) { return bcrypt.hash(password, bcrypt.genSaltSync(8)); }, validPassword(password) { return bcrypt.compare(password, this.password); } } }); return User; }
其他替代方法:使用hook和bcrypt异步模式
User.beforeCreate((user, options) => { return bcrypt.hash(user.password, 10) .then(hash => { user.password = hash; }) .catch(err => { throw new Error(); }); });
那里有一个教程,介绍如何使用钩子和bcrypt来获得sequelize / postgreSQL身份验证系统。
编写本教程的人没有使用异步哈希/盐方法;在用户创建/实例方法部分中,他使用了以下代码:
hooks: { beforeCreate: (user) => { const salt = bcrypt.genSaltSync(); user.password = bcrypt.hashSync(user.password, salt); } }, instanceMethods: { validPassword: function(password) { return bcrypt.compareSync(password, this.password); } }
较新版本的Sequelize不喜欢以这种方式声明实例方法-并且许多人已经解释了如何解决此问题(包括在原始教程中发布的人):
原始注释仍使用同步方法:
User.prototype.validPassword = function (password) { return bcrypt.compareSync(password, this.password); };
使这些功能异步所需要做的就是:
异步beforeCreate bcrypt genSalt和genHash函数:
beforeCreate: async function(user) { const salt = await bcrypt.genSalt(10); //whatever number you want user.password = await bcrypt.hash(user.password, salt); } User.prototype.validPassword = async function(password) { return await bcrypt.compare(password, this.password); }
在您检查密码的登录路径中的node.js应用程序上,有一个findOne部分:
User.findOne({ where: { username: username } }).then(function (user) { if (!user) { res.redirect('/login'); } else if (!user.validPassword(password)) { res.redirect('/login'); } else { req.session.user = user.dataValues; res.redirect('/dashboard'); } });
您在这里要做的就是添加单词async
和await
:
User.findOne({ where: { username: username } }).then(async function (user) { if (!user) { res.redirect('/login'); } else if (!await user.validPassword(password)) { res.redirect('/login'); } else { req.session.user = user.dataValues; res.redirect('/dashboard'); } });