使用bcrypt存储密码无效

Use bcrypt to store password takes no effect

我使用 mongodb 来存储我的用户 table,并使用 bcrypt 来存储密码。但是,存储的密码都是真实的文本。我的节点 js 代码如下:

var mongoose = require('mongoose')
var bcrypt = require('bcrypt')
var SALT_WORK_FACTOR = 10

var UserSchema = new mongoose.Schema({
name:{
    type:String,
    required: true,
    unique: true
},
password: {
    type: String,
    required: true
}
meta: {
    createAt: {
        type: Date,
        default: Date.now()
    },
    updateAt: {
        type: Date,
        default: Date.now()
      }
  }
})
UserSchema.pre('save',function(next){
var user = this
if(this.isNew){
    this.meta.createAt = this.meta.updateAt = Date.now()
}
else{
    this.meta.updateAt = Date.now()
}

bcrypt.genSalt(SALT_WORK_FACTOR,function(err, salt){
    if(err) return next(err)
        console.log('salt'+salt)
        bcrypt.hash(user.password, salt, function(err, hash){
            console.log('hash'+hash)
            if(err) 
                return next(err)

            console.log('set user password' + hash)
            user.password = hash
            next()

        })
})

next()
})

之后,我在我的 mongo 终端中使用 db.users.find() ,我看到的只是以真实文本存储的密码:

{ "_id" : ObjectId("54d2f5a4162a7335c0036cae"), "name" : "12", "password" : "12", "meta" : { "updateAt" : ISODate("2015-02-05T04:46:28.246Z"), "createAt" : ISODate("2015-02-05T04:46:28.246Z") }, "__v" : 0 }

{ "_id" : ObjectId("54d2f89c0675b329c3e783d4"), "name" : "34", "password" : "34", "meta" : { "updateAt" : ISODate("2015-02-05T04:59:08.285Z"), "createAt" : ISODate("2015-02-05T04:59:08.285Z") }, "__v" : 0 }

{ "_id" : ObjectId("54d2f9703b55cdf5c32af5b2"), "name" : "457", "password" : "457", "meta" : { "updateAt" : ISODate("2015-02-05T05:03:23.338Z"), "createAt" : ISODate("2015-02-05T05:03:23.338Z") }, "__v" : 0 }

因此,我的比较函数总是 return false:

UserSchema.methods = {
comparePassword: function(_password, cb){
    bcrypt.compare(_password, this.password, function(err, isMatched){
        if(err) 
            return cb(err)

        cb(null, isMatched)
    })
}
}

有人可以帮我解决这个问题吗?

我的猜测是,因为在调用 bcrypt.genSalt() 后立即有一个额外的 next(),所以 user.password 的值在条目保存到数据库之前没有改变.因此,在 bcrypt.genSalt() 之后立即删除 next(),它应该会按预期工作。