2016-02-05 192 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 –