2015-08-15 80 views
1

我正在使用bcrypt-nodejs來對預保存函數內的密碼進行哈希處理。 我不明白爲什麼我繼續在bcrypt.hash的回調函數內部收到錯誤'[TypeError:undefined不是函數]'。使用bcrypt-nodejs未定義的函數

var mongoose = require('mongoose'), 
    validate = require('mongoose-validate'), 
    bcrypt = require('bcrypt-nodejs'), 
    SALT_WORK_FACTOR = 10, 
    REQUIRED_PASSWORD_LENGTH = 8; 

function validateStringLength (value) { 
    return value && value.length >= REQUIRED_PASSWORD_LENGTH; 
} 

var schema = mongoose.Schema({ 
    email: {type: String, 
      required: true, 
      unique: true, 
      validate: [validate.email, 'is not a valid email address'] 
    }, 
    passHash: {type: String, 
       required: true, 
       validate: [validateStringLength, 'The password must be of min ' + REQUIRED_PASSWORD_LENGTH + ' characters length.']} 
}); 

schema.pre('save', function (next) { 
    var self = this; 

    if (!self.isModified('passHash')) return next(); 

    bcrypt.hash(self.passHash, SALT_WORK_FACTOR, null, function encryptedPassword (err, hash) { 
     if(err) console.log(err); 

     self.passHash = hash; 
     next(); 
    }); 
}); 

schema.set('autoIndex', App.env !== 'production'); 

var Model = mongoose.model('User', schema); 
module.exports = Model; 

我檢查了參數傳遞,他們是正確的。 此外,返回的散列值爲空。

有沒有人有類似的經歷? 我正在使用bcrypt-nodejs,因爲在使用npm進行安裝時,bcrypt會給我提供錯誤。

回答

5

可再現這一點:

var bcrypt = require('bcrypt-nodejs') 

bcrypt.hash('foo', 10, null, function(err) { 
    if (err) throw err; 
}); 

的問題是,鹽必須是一個字符串(內部,bcrypt-nodejs使用salt.charAt(),並charAt()是未定義號碼)。

你可能想這樣的:

bcrypt.hash(self.passHash, bcrypt.genSaltSync(SALT_WORK_FACTOR), ...); 

(或異步版本,bcrypt.genSalt()

+0

我沒有注意到從bcrypt此不同的參數(錯誤是bcrypt-的NodeJS),謝謝 – user2861867