2017-06-19 81 views
1

我遇到了問題,我無法解決。 我會盡力將其描述爲儘可能有意義和簡單。 這是我的方法,來處理POST請求,並保存數據:貓鼬|預保存鉤子中的對象更改不會保存到db

app.post('/users/', (req, res) => { 
    let body = _.pick(req.body, ["email", "password"]); 
    let user = new User(body); 

    user.save().then(
     user => res.json(user), 
     err => res.send(err) 
    ) 
}); 

當我保存新的用戶數據庫,這預存鉤火災:

userSchema.pre('save', function(next) { 
    var user = this; 

    if(user.isNew){ 
     bcrypt.genSalt(10, (err, salt) => { 
      bcrypt.hash(user.password, salt, (err, hash) => { 
       user.password = hash; 
       console.log(user); 
       next(); 
      }) 
     }) 
    } 
    next(); 
}) 

對於POST身體此輸入:從預保存鉤日誌

{ 
    "email": "[email protected]", 
    "password": "somepass" 
} 

的console.log:

{ __v: 0, 
    email: '[email protected]', 
    password: '$2a$10$tWuuvw.wGicr/BTzHaa7k.TdyZRc5ADDV0X1aKnItvVm6JYVe5dsa', 
    _id: 59482e8136fd8d2bf41e24b7 
} 

然而,在分貝我有:

{ 
    "_id" : ObjectId("59482e8136fd8d2bf41e24b7"), 
    "email" : "[email protected]", 
    "password" : "somepass", 
    "__v" : 0 
} 

用戶對象上顯然不保存更改並在save()方法我仍然使用舊的價值觀念與散列的口令。這是爲什麼?我怎樣才能從預存儲鉤子進行更改存儲?

回答

0

問題是,即使在密碼需要異步加密時,您總是在if塊後呼叫next()

更改代碼,只做到這一點對現有user文檔:

if(user.isNew){ 
    bcrypt.genSalt(10, (err, salt) => { 
     bcrypt.hash(user.password, salt, (err, hash) => { 
      user.password = hash; 
      console.log(user); 
      next(); 
     }) 
    }) 
} 
else { 
    next(); 
} 
+0

我簡直不能相信我沒有弄清楚它在我自己的。這非常愚蠢。 JohnnyHK非常感謝!最好的祝福! – kkotula