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(); });
所以对于总结,我看到的一个区别是,
-
你可以使用这两个,只要你得到input,直接保存在数据库中,而不改变任何东西(只有validation)。
-
如果你正在改变任何你必须使用预存钩。
上面的答案是不正确的。 如果你去: https : //github.com/Automattic/mongoose/issues/400,并阅读mongoose撰稿人对这个话题的回应,你会看到他注意到他们是故意运行的。
该主题被命名为: validation应该在所有其他预保存钩子之后运行
mongoose的贡献者aheckmann说:
- 现在正在他们面前奔跑
- 没有实现这一点。 首先进行validation使我们有机会在继续进入用户定义的钩子之前停止,这些钩子可能包括对其他集合的asynchronous更新。