在mongoose中更改挂钩优先级

时间:2014-07-15 08:08:29

标签: mongoose hook middleware keystonejs

我在这样的模型上有2个钩子(在不同的文件中):

model.pre('save', function(next) {
    if (this.isModified('password'))
        this.set('password, hash(this.get('password'))
    next()
})

model.pre('save', function() {
    if (this.isNew)
        this.set('password', generatePassword())
    next()
})

我的第一个钩子来自一个模块,它必须是第一个,我无法修改它。它会检查密码字段是否已修改,如果是,则将其哈希。 我的第二个钩子是由我创建的,我在创建用户时设置了随机生成的密码。

我的问题是我的第一个钩子不会哈希我的密码,因为它在第二个钩子之前通过了。我试图在我的第二个挂钩中调用this.save,但如果我这样做,则isModified为假。

我不得不将第一个挂钩的hash功能复制到第二个文件中以使其正常工作,但它远非完美。

所以我想知道是否有办法以mongoose的优先顺序运行钩子? 感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,mongoose没有提供一种方法来确定pre save钩子或任何其他类型的钩子的优先级。但是,在您的特定用例中,您可能需要考虑使用post validate挂钩。

model.post('validate', function (doc) {
    if (doc.isNew) {
       doc.set('password', generatePassword());
    }
});

post validate挂钩在保存文档之前以及任何用户定义的pre save挂钩之前执行。