错误哈希密码字段mongodb

时间:2017-03-14 02:44:19

标签: node.js mongodb express mongoose

我正在为应用创建用户模型。我的用户架构是:

const mongoose = require('mongoose');
const Schema =  mongoose.Schema;
const bcrypt = require('bcrypt-nodejs');
SALT_WORK_FACTOR = 10;

const userSchema = Schema({
  email:{type: String, required: true},
  encrypted_password:{type: String, required: true},
  reset_password_token:{type: String},
  reset_password_sent_at:{type: Date},
  sign_in_count:{type: Number},
  current_sign_in_at:{type: Date},
  last_sign_in_at:{type: Date},
  current_sign_in_ip:{type: String},
  last_sign_in_ip:{type: String},
  active:{type: Boolean},
  role_id:[{ type: Schema.Types.ObjectId, ref: 'roles' ,required: true}],
  create_date:{type: Date, default: Date.now},
});

这是我的创建方法:

module.exports.insert = (user, callback) => {
  User.create(user,callback);
}

我添加此函数来散列密码,但不起作用:

User.pre('create', function(next) {
    var user = this;

    // only hash the password if it has been modified (or is new)
    if (!user.isModified('encrypted_password')) return next();

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

        // hash the password using our new salt
        bcrypt.hash(user.encrypted_password, salt, function(err, hash) {
            if (err) return next(err);

            // override the cleartext password with the hashed one
            user.encrypted_password = hash;
            next();
        });
    });
});

我收到错误

  

User.pre不是函数。

如何使用create function存储加密密码以保存数据。

提前致谢

3 个答案:

答案 0 :(得分:2)

来自mongoose documentation

  

中间件(也称为前后挂钩)是函数   在执行异步函数期间传递控制。的中间件   在架构级别指定,对编写插件很有用

应该在架构级别指定,而不是在模型上指定:

userSchema.pre('create', function(next) {
    ....
});

答案 1 :(得分:0)

在您的用户架构文件中尝试此操作:

var hashPass = function (value) {
    return bcrypt.hashSync(value);
}

并将您的密码定义到您的架构中,如下所示:

 encrypted_password:{type: String, required: true, set: hashPass}

创建文档时会自动创建加密密码。

答案 2 :(得分:0)

我们可以使用这个简单的逻辑来使用bcrypt创建加密密码:

exports.generateEncrytPassword = (password) => {
  console.log("passsword", password)
  return bcrypt.hashSync(password, bcrypt.genSaltSync(9));
}