在帆中有条件的beforeUpdate

时间:2014-12-02 11:18:55

标签: sails.js waterline

只有在满足某些条件时才需要加密密码。

beforeUpdate: function (value, cb) {
User.findOne(value.id)
  .exec(function (err, originalUser) {
    if (err || !originalUser) {
      return cb();
    }
    //encrypt the password only if the password is not previously encrypted
    if (value.password != originalUser.password) {
       //encrypt the Pwd
    } else {
      cb();
    }
  });

} 问题是,值对象只包含更新参数,如何在值对象中获取整个用户对象?

6 个答案:

答案 0 :(得分:5)

  

更新async后,此方法不再起作用。

您无法在beforeUpdate内获取整个对象。你可以试试这个来获取id。 var id= this.update.arguments[0]

答案 1 :(得分:2)

为了扩展user3036010的建议,我最终创建了一个像这样的新政策:

api/policies/propagateId.js

module.exports = function(req, res, next) {
    var id = req.param('id');
    if (id && req.body) {
        req.body.id = id;
    }

    next();
};

然后设置api/config/policies.js文件以默认将策略应用于所有控制器和操作:

module.exports.policies = {
    '*': 'propagateId'
};

这样做会强制在文档正文中设置id属性,这会使更新操作变得认为手动指定了id。无论出于何种原因,更新操作中都有一段代码检查,如果id未手动指定,则会将其从值中删除。

这有点滥用政策,但似乎对我来说很好。如果您不想这样做,看起来每次发布更新API请求时,请在您的请求正文中手动指定id

答案 2 :(得分:1)

我不确定您为什么需要在此处的值对象中使用此功能,但您可以创建一个自定义策略来获取整个用户对象并发送' next()'回调更新;

答案 3 :(得分:1)

只需使用lodash即可使用originalUser扩展值。或者对于这个用例,如果使用节点bcrypt或其他东西,你总是可以检查密码是否已经过哈希

答案 4 :(得分:1)

现在,只有在Update方法中发送密码:密码时,它才会更新密码(散列和存储),否则它只会更新提供的用户字段。

Controller(UserController.js):

updateDisplayName: function(req, res) {

var userid = req.token;
var newDisplayName = req.param('newdisplayname');

User.update({id: userid},{displayname: newDisplayName}).exec(function afterwards(err,updated){

if (err) {
res.json(err);
} else {
res.json("Success");
}
});

},

模型(user.js的):

beforeUpdate: function(values, next) {
if(values.password) {
hashPassword(values, next);
} else {
next();
}
},

答案 5 :(得分:1)

我也尝试做类似的事情:将密码保存到相关的护照记录中。我正在使用sails-auth和sails-permissions模块,其中包括护照。

我终于能够通过使用afterValidate lifecycle callback而不是beforeUpdate回调来实现。在afterValidate回调中,您可以使用this.user访问用户模型。

这是我在afterValidate回调中输入的代码,其中我保存了使用Passport模型传入的密码:

afterValidate: function(updates, next) {
  // Update the passport password if it was passed in
  if(updates.password) {
    Passport.update({user: this.user.id}, {password: updates.password}).exec(function(err, passport) {
      next(err);
    });
  }
  else {
    next();
  }
}