mongoose预存和validation的区别? 何时使用哪一个?

目前我正在使用pre('save')来进行validation:

 UserSchema.pre('save', true, function(next, done) { var self = this //in case inside a callback var msg = helper.validation.user.username(self.username) if (msg) { self.invalidate('username', msg) done(helper.getValidationError(msg)) } else done() next() }) 

助手模块具有接受input并返回错误消息的function。

 exports.user = { username: function(input) { if (!input) return 'username is required' var min = 3 var max = 10 if (input.length < min) return 'username min of length is ' + min if (input.length > max) return 'username max of length is ' + max return null } } 

还有另一个API validate做类似的事情。 他们之间有什么区别,我应该在什么情况下使用哪一个?

更新:

validation在用户定义的钩子之前执行。 你可以关注这个贡献者说的githubpost ,

没有实现这一点。 首先进行validation使我们有机会在继续进入用户定义的钩子之前停止,这些钩子可能包括对其他集合的asynchronous更新。

如果我们需要validation在从钩子内部进行更改后再次运行,我们总是可以手动运行this.validate(next)


已过期:

是的,我知道有一个小小的差别。

预钩在执行validation之前执行。

github上有一个封闭的问题,要求在提前validation, https://github.com/Automattic/mongoose/issues/400


还有一个原因,就是在pre hooks之前没有进行validation,在@kamholz的相同链接中提到:

假设你有两个字段,foo和fooSort,都是必需的。 fooSort是foo的小写或其他转换版本,用于sorting。 由于fooSort可以自动生成,所以在预保存钩子中这样做是有意义的。 但是,由于validation首先运行,它将在保存前钩子运行之前失败,并有机会填充fooSort值。 这不是能够手动再次运行validation的问题。

再一次,如果你想validation一些东西,然后需要勾后validation:

 UserSchema.post('validate', function(next){ console.log("post validate called"); next(); }); 

所以对于总结,我看到的一个区别是,

  1. 你可以使用这两个,只要你得到input,直接保存在数据库中,而不改变任何东西(只有validation)。

  2. 如果你正在改变任何你必须使用预存钩。

上面的答案是不正确的。 如果你去: https : //github.com/Automattic/mongoose/issues/400,并阅读mongoose撰稿人对这个话题的回应,你会看到他注意到他们是故意运行的。

该主题被命名为: validation应该所有其他预保存钩子之后运行

mongoose的贡献者aheckmann说:

  • 现在正在他们面前奔跑
  • 没有实现这一点。 首先进行validation使我们有机会在继续进入用户定义的钩子之前停止,这些钩子可能包括对其他集合的asynchronous更新。