只有当密码存在时才保存密码哈希值

我有一个表单,用户可以创build一个带有可选密码字段的房间。 我只想保存密码,只要密码字段包含某些内容(不是空的)。 我有散列中间件散列密码,然后将其保存到mongodb。 即使密码字段为空,它也会保存一个散列值。 我试图添加一个条件来检查是否有一个值,然后进行散列,但这似乎并不工作。

这是我的post:

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(); }); }); } }); 

当你有支票时会发生什么?

从我所看到的,你需要在中间件的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(); });