2017-06-21 52 views
1

我的用户模型是Bookshelf.js使用bcrypt

var Bookshelf = require('../../db').bookshelf; 
var bcrypt = require('bcrypt'); 
var Promise = require('bluebird'); 
var Base = require('./../helpers/base'); 

// User model 
var User_Model = Bookshelf.Model.extend({ 
    tableName: 'users', 
    initialize: function() { 
     this.on('saving', this.hashPassword, this); 
    }, 
    hashPassword: function(model, attrs, options) { 
     return new Promise(function(resolve, reject) { 
      bcrypt.hash(model.attributes.password, 10, function(err, hash) { 
       if(err) reject(err); 
       model.set('password', hash); 
       resolve(hash); // data is created only after this occurs 
      }); 
     }); 
    } 
}); 

在创建密码设置为

$2a$10$QD6FmChgGZEMooCklLfemOvAaHHV2RfUMQ5EoNwuMeojb6y2Hh2iK 

用户,并在登录完美的工作每次更新更改密码数据,

当对用户字段进行任何更新时,会导致每次更改密码为随机值

$2a$10$IVW.2JN/TPVABsx73t870uwKMNsDKoGmLJzOs1y/MPMOe.WRMBL4W 

$2a$10$12sjEqM3t345dcq7rDixgu.9TZiWOC.JN5Ke8SI2F0IXv/YpdRwTK 
+0

在旁注 - 你应该在nodejs 8.0中检出async/await。而不是以您使用async/await的方式使用Promise是更简洁的语法,并使代码易于阅读。 一些链接: [点击这里](https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9) [链接Promisifying核心函数库](https://medium.com/front-end-hacking/promises-in-node-js-8-x-core-d6a8a93e85a2) – j10

回答

0

由于您正在使用bookshelfjs。你可以使用Bookshelf-bycrypt plugin 它负责散列密码。当更新表格行更新明确如下

model.save([key], [val], [attrs], [options]) 


// update authors set "bio" = 'Short user bio' where "id" = 1 
new Author({id: 1, first_name: 'User'}) 
    .save({bio: 'Short user bio'}, {method: "update" }{patch: true},) 
    .then(function(model) { 
    // ... 
    }); 
+0

不{{patch:true}暗示更新。我的意思是我们不能跳过{method:“update”}部分吗? – j10