仅在存在密码时保存密码哈希

时间:2016-02-05 07:49:04

标签: node.js mongodb express mongoose

我有一个表单,用户可以使用可选的密码字段创建一个房间。我只想在密码字段包含某些内容(非空)时保存密码。我有哈希中间件,在将密码保存到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();
});
 });
 }
});

1 个答案:

答案 0 :(得分: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();
});