2016-02-05 141 views
1

我有一個表單,用戶可以在其中創建一個帶有可選密碼字段的房間。我只想在密碼字段包含某些內容(非空)時才保存密碼。我有散列中間件散列密碼,然後將其保存到mongodb。即使密碼字段爲空,它也會保存一個散列值。我試圖添加一個條件來檢查是否只有一個值才能繼續散列,但這似乎不起作用。只有當密碼存在時才存儲密碼哈希值

這是帖子:

exports.postCreateRooms = function(req, res, next) { 
req.assert('workspace', 'Please enter a board name').notEmpty(); 
var errors = req.validationErrors(); 
var enableVideo; 
if (errors) { 
req.flash('errors', errors); 
return res.redirect('/dashboard'); 
} 
var url = uuid.v4(); 


var room = new Room({ 
roomUrl: url, 
roomName: req.body.workspace, 
owner:req.user._id, 
     ownerEmail:req.user.email, 
dateCreated: Date(), 
     lastUpdated: Date(), 
     users: [req.user._id] 
}); 
if (req.body.password != ''){ 
room.password = req.body.password; 
} 

room.save(function(err) { 
    if (err) { 
     return next(err); 
    } 
res.redirect('/board='+room.roomUrl); 
}); 

}; 

這裏是我的散列中間件:

roomSchema.pre('save', function(next) { 
    var room = this; 


if(room.password){ 

bcrypt.genSalt(10, function(err, salt) { 
if (err) { 
    return next(err); 
} 

bcrypt.hash(room.password, salt, null, function(err, hash) { 
    if (err) { 
    return next(err); 
    } 
    room.password = hash; 
    next(); 
}); 
}); 
} 
}); 

回答

2

當你有地方檢查,會發生什麼?

從我所看到的情況來看,您需要在中間件的if塊之外進行next()調用,所以即使沒有指定密碼,它也會繼續進行。

它看起來像

roomSchema.pre('save', function(next) { 
    var room = this; 

    if(room.password){ 
    return bcrypt.genSalt(10, function(err, salt) { 
     if (err) { 
     return next(err); 
     } 
     bcrypt.hash(room.password, salt, null, function(err, hash) { 
     if (err) { 
      return next(err); 
     } 
     room.password = hash; 
     next(); 
     }); 
    }); 
    } 
    next(); 
}); 
+1

你需要在'bcrypt.genSalt()'調用前加上一個'return',否則就會面臨雙重回調的問題。 – gyamana

+0

它掛着...添加下一個作品,但現在它不通過if函數,因此不會散列密碼。 –

+0

在brcyp.genSalt()調用之前添加return會有訣竅!謝謝@gyamana –