2015-07-10 127 views
1

您好我是Mongoose的新手並嘗試使用pre命令將字符串中的給定密碼轉換爲哈希值,然後將其保存到數據庫中。我沒有得到任何語法錯誤,但我的密碼沒有被轉換成哈希IDS。Mongoose Pre命令不能正常工作

我的控制器代碼如下:

User.save(req.body,function(err,data){ 
     if (err) { 
     res.json({ 
      sucess:false, 
      exception:err 
     }); 
     } 
    else{ 
    res.json({ 
      sucess:true, 
      User:data 
     }); 

    } 
}); 

    User.pre('save',function(next){ 
     bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){ 
       if(err){ 
        return res.json({ 
          success:false, 
          exception:err 
        }); 
       } 
        bcrypt.hash(password, salt, function(err, hash) { 
        if(err){ 
         return res.json({ 
          success:false, 
          exception:err 
        }); 
        } 
       password=hash; 
       }); 
      }); 
     next();  

    }); 

使用節點檢查,我發現,命令行沒有進入User.pre。所以有人可以讓我知道我犯了一個錯誤。

+0

用戶必須是你的模式,是嗎?或者它是模型?替換字符串password = hash; to this.password = hash –

+0

用戶是我的代碼中的一個模型。 – shubhamagiwal92

+0

查看原文 - http://mongoosejs.com/docs/middleware.html –

回答

1

有各種各樣的事情你的代碼錯誤,主要部分在於鉤應附於架構而不是模型,這似乎是你在做什麼。

此外,它看起來像你試圖爲每個請求添加一個預保存鉤子,這不是鉤子應該如何工作:它們應該在架構上聲明一次(如上所述)和之前您創建模型。

順序應與此類似:

var UserSchema = new mongoose.Schema(...); 

UserSchema.pre('save', ...); 

var User = mongoose.Model(UserSchema); 

這意味着你不能發送從預存掛鉤,如你想現在要做的,但你不」的錯誤響應無論如何,IMO確實需要這樣做(你應該將你的Mongoose模式/模型與Express路由處理程序分開)。相反,請捕獲在.save()期間拋出的任何錯誤並在那裏處理它們。

要查看關於什麼是合適的掛鉤可能看起來像一個想法,這裏是一個例子(我花了猜測,您User架構,因此它可能使用了錯誤的字段名):

UserSchema.pre('save', function(next) { 
    var document = this; 
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { 
    if (err) return next(err); 
    bcrypt.hash(document.password, salt, function(err, hash) { 
     if (err) return next(err); 
     document.password = hash; 
     next(); 
    }); 
    }); 
});