我正在sequelize中进行自定义验证,但它给了我错误,实际上它首先转换为散列,在转换为散列后进行验证,我想在转换为散列之前使用验证。
我试过这个
const { DataTypes } = require("sequelize");
const sequelize = require("../helper/db.config");
const User = sequelize.define("User", {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false,
},
first_name: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: {
msg: 'Please enter your first name'
}
}
}
,
last_name: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: {
msg: 'Please enter your last name'
}
}
}
,
email: {
type: DataTypes.STRING,
unique: true,
allowNull: false,
validate: {
isEmail: { args: true, msg: 'email format is not correct' },
notNull: { args: true, msg: 'email can\'t be empty' },
notEmpty: { args: true, msg: 'email can\'t be empty string' },
}
}
,
password: {
type: DataTypes.STRING,
allowNull: false,
validate: {
validatePassword: function(password) {
if(!(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,12}$/.test(password))) {
throw new Error('The password must contain at least 8 and maximum 12 characters including at least 1 uppercase, 1 lowercase, one number and one special character.');
}
}
},
}
,
mobile_number: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: {
msg: 'Please enter your mobile number'
}
}
}
,
role: {
type: DataTypes.ENUM,
values: ['user', 'admin', 'teacher', 'staff'],
defaultValue: 'user',
}
,
});
module.exports = User;
这是用于发布的控制器代码
const createUser = async (req, res) => {
try {
const { first_name, last_name, email, password, mobile_number, role } = req.body;
let hashPassword;
if (password) {
const salt = await bcrypt.genSalt();
hashPassword = await bcrypt.hash(password, salt);
}
const user = await User.create({
first_name ,
last_name,
email,
mobile_number,
password: hashPassword,
role : (role ? role : 'user')
} );
res.status(HttpStatus.CREATED.code).send({
msg: `USER ${HttpStatus.CREATED.msg}`,
user,
});
} catch (error) {
// const errobj = error.errors.map(e => console.log(e.message))
if (error.name === 'SequelizeValidationError') {
return res.status(HttpStatus.BAD_REQUEST.code).json({
success: false,
// msg: error.errors.map(e => e.message)
msg: error
})
}
else {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR.code).json({
success: false,
// msg: error.errors.map(e => e.message)
msg: error
})
}
}
};
我使用了上面的代码,但它不起作用
我知道这是一个迟到的回复, 对我来说最有效的是在续集中使用钩子 就像 beforeCreate 或 afterValidate 钩子
hooks: {
afterValidate: async (user) => {
const salt = await bcrypt.genSalt(10);
user.Password = await bcrypt.hash(user.Password, salt);
},
},
这是我的 user.js 模型代码
"use strict";
const { Model } = require("sequelize");
const bcrypt = require("bcrypt");
module.exports = (sequelize, DataTypes) => {
class User extends Model {
static associate({ Post }) {
this.hasMany(Post, { foreignKey: "UserId", as: "Posts" });
}
toJSON() {
return { ...this.get(), id: undefined };
}
}
User.init(
{
uuid: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
},
UserName: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: { msg: "The username can't be null." },
notEmpty: { msg: "The username can't be an empty." },
},
},
Email: {
type: DataTypes.STRING,
unique: { msg: "This email already in use." },
allowNull: false,
validate: {
notNull: { msg: "The email can't be null." },
isEmail: { msg: "Please provide a valid email address." },
notEmpty: { msg: "The email can't be an empty." },
},
},
Password: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notNull: { msg: "The password can't be null." },
notEmpty: { msg: "The password can't be an empty." },
is: {
args: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d@$!%*?&]{8,}$/,
msg: "Password must contain at least 8 characters, one lowercase letter, one uppercase letter, and one number.",
},
},
},
},
{
sequelize,
modelName: "User",
hooks: {
afterValidate: async (user) => {
const salt = await bcrypt.genSalt(10);
user.Password = await bcrypt.hash(user.Password, salt);
},
},
}
);
return User;
};
因此,您将从控制器中删除哈希并将其添加到模型中