nodejs bcrypt在db中没有哈希密码

时间:2017-10-01 21:37:39

标签: node.js mongoose bcrypt

我想在创建用户时哈希用户密码。用户已创建,但密码未经过哈希处理我不明白为什么..这是我的代码:

var mongoose = require('mongoose');
var jwt = require('jsonwebtoken');
var User = mongoose.model('User');
var config = require('../../config/config');
var bcrypt = require('bcrypt');
var SALT_WORK_FACTOR = 10;

exports.create_a_user = function(req, res) {
    var user = new User(req.body);
user.schema.pre('save', function(next){
var user = this;
if (!user.isModified('password')) return next();

bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){
    if(err) return next(err);

    bcrypt.hash(user.password, salt, function(err, hash){
        if(err) return next(err);

        user.password = hash;
        next();
    });
  });
});


 user.save(function(err, user) {
        if (err){
            res.send(err);
        }
        res.json(user);
    });
};

这是我的用户模型:

module.exports = mongoose.model('User', new Schema({
    lastname: {
       type: String,
       validate: {
         validator: function(v) {
           return /^([a-zA-ZàáâäæçéèêëîïôœùûüÿÀÂÄÆÇÉÈÊËÎÏÔŒÙÛÜŸ \-\']+)$/.test(v);
         },
         message: 'Le champ {PATH} ne doit pas contenir de caractères spéciaux ou de chiffres !'
       },
       required: [true, "Le champ nom de famille est requis"]
     },

    firstname: {
       type: String,
       validate: {
         validator: function(v) {
           return /^([a-zA-ZàáâäæçéèêëîïôœùûüÿÀÂÄÆÇÉÈÊËÎÏÔŒÙÛÜŸ \-\']+)$/.test(v);
         },
         message: 'Le champ {PATH} ne doit pas contenir de caractères spéciaux ou de chiffres !'
       },
       required: [true, "Le champ prénom est requis"]
     },

    mail: {
       type: String,
       validate: {
         validator: function(v) {
           return /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/.test(v);
         },
         message: '{VALUE} n\'est pas une adresse mail valide!'
       },
       required: [true, "L'email est requis"]
     },

    password: {
       type: String,
       required: [true, "Le mot de passe est requis"]
     },

    phone: {
        type: String,
        validate: {
          validator: function(v) {
            return /^0[0-9]([-. ]?\d{2}){4}[-. ]?$/.test(v);
          },
          message: '{VALUE} n\'est pas un numéro de téléphone valide!'
        },
        required: [true, 'Le numéro de téléphone est requis']
      },

}));

我的表格:

<form method="post" action="/api/v1/user/register">
    <input type="text" name="lastname" placeholder="lastname"><br>
    <input type="text" name="firstname" placeholder="firstname"><br>
    <input type="text" name="adress" placeholder="adress"><br>
    <input type="text" name="mail" placeholder="mail"><br>
    <input type="password" name="password" placeholder="password"><br>
    <input type="text" name="phone" placeholder="phone"><br>
    <input type="date" name="birthdate" placeholder="birthdate"><br>
    <input type="submit" value="Connection">

我经历了很多不同的网站,方法总是一样的。此外,它不识别“.pre()”函数而没有.schema之前然后创建用户工作,但没有任何哈希密码。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在导出模型之前,应在架构上设置预保存挂钩。

用户模型:

var UserSchema = new Schema({
  ...
})

UserSchema.pre('save', function(next) {

  var user = this

  if (!user.isModified('password')) return next()

  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {

    if (err) return next(err)

    bcrypt.hash(user.password, salt, function(err, hash) {

      if(err) return next(err)

      user.password = hash

      next()

    })

  })

})

module.exports = mongoose.model('User', UserSchema)