2017-03-29 86 views
0

對nodejs來說還是比較新的,所以我經常被整個異步事物絆倒。我正在嘗試使用bcrypt和bookshelf在將密碼存儲到數據庫之前對其進行散列處理。漂亮的直線前進吧...使用bcrypt和bookhelf無法將散列密碼保存到數據庫

我打電話保存操作,像這樣,

create(data) { 
    this.logger.info(`creating account`); 
    return bookshelf.transaction(trx => { 
     return new Account().save(data, { method: 'insert', transacting: trx }); 
    }); 
} 

,並在賬戶模式,我攔截攢動

initialize: function() { 
    let _this = this; 
    const saltRounds = 10; 
    _this.on('creating', function() { 
     bcrypt.genSaltSync(saltRounds, function(err, salt) { 
      bcrypt.hashSync(_this.get('password'), salt, function (err, hash) { 
       if (err) throw err; 

       _this.set('password', hash); 
      }); 
     }); 
    }); 
} 

一切我已經看了到目前爲止說這應該工作,但純文本密碼仍然保存到數據庫而不是哈希密碼。我究竟做錯了什麼?

回答

0

您使用同步功能,但通過他們的回調,從而贏得」不會被調用(因此,密碼將不會被替換)。

試試這個:

initialize: function() { 
    const saltRounds = 10; 
    this.on('creating',() => { 
    let salt = bcrypt.genSaltSync(saltRounds); 
    let hash = bcrypt.hashSync(this.get('password'), salt); 
    this.set('password', hash); 
    }); 
} 

或更換與異步的人同步功能,使用的承諾(這是由兩個bcryptbookshelf支持):

initialize: function() { 
    const saltRounds = 10; 
    this.on('creating',() => { 
    return bcrypt.genSalt(saltRounds).then(salt => { 
     return bcrypt.hash(this.get('password'), salt); 
    }).then(hash => { 
     this.set('password', hash); 
    }); 
    }); 
} 
+0

非常感謝隊友,這兩種方法工作大! – user3010617

0

我不知道,但我認爲錯誤是因爲你使用ES6讓,而不是VAR 那麼這樣的背景下將推遲

相關問題