如何在nodejs中的sequelize中哈希之前验证密码

问题描述 投票:0回答:1

我正在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
            })
        }
        
        
    }
};

我使用了上面的代码,但它不起作用

node.js sequelize.js
1个回答
0
投票

我知道这是一个迟到的回复, 对我来说最有效的是在续集中使用钩子 就像 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;
};

因此,您将从控制器中删除哈希并将其添加到模型中

© www.soinside.com 2019 - 2024. All rights reserved.