Naz*_*zar 6 javascript validation mongoose mongodb node.js
首先,这没有帮助.
比方说,我们有一个用户模型:
const schema = new mongoose.Schema({
active: { type: Boolean },
avatar: { type: String }
});
const User = mongoose.model('User', schema);
Run Code Online (Sandbox Code Playgroud)
当我们更新它(设置一个头像):
// This should pass validation
User.update({ _id: id }, { $set: { avatar: 'user1.png' } });
Run Code Online (Sandbox Code Playgroud)
我们希望根据当前(或更改的)active属性值对其进行验证.
active 是 falseactive 是 trueconst schema = new mongoose.Schema({
active: { type: Boolean },
avatar: { type: String, validate: [validateAvatar, 'User is not active'] }
});
function validateAvatar (value) {
console.log(value); // user.avatar
console.log(this.active); // undefined
}
Run Code Online (Sandbox Code Playgroud)
所以这不起作用,因为我们没有访问active字段.
schema.pre('validate', function (next) {
// this will never be called
});
Run Code Online (Sandbox Code Playgroud)
此挂钩不适用于update方法.
schema.pre('update', function (next) {
console.log(this.active); // undefined
});
Run Code Online (Sandbox Code Playgroud)
这对我们不起作用,因为它无法访问模型字段.
schema.post('update', function (next) {
console.log(this.active); // false
});
Run Code Online (Sandbox Code Playgroud)
这个可行,但在验证方面不是很好的选择,因为只有在模型已经保存时才调用该函数.
那么有什么方法可以在保存之前基于几个字段(保存在DB和新的字段中)验证模型,同时使用model.update()方法?
作为总结:
{ active: false, avatar: null }
Run Code Online (Sandbox Code Playgroud)
User.update({ _id: id }, { $set: { avatar: 'user1.png' } });
Run Code Online (Sandbox Code Playgroud)
{ active: false, avatar: 'user1.png' }
Run Code Online (Sandbox Code Playgroud)
由于工作的限制,update()我决定这样解决问题:
update()所以而不是
User.update({ _id: id }, { $set: { avatar: 'user1.png' } });
Run Code Online (Sandbox Code Playgroud)
我用
User.findOne({ _id: id })
.then((user) => {
user.avatar = 'user1.png';
user.save();
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,自定义验证器按预期工作。
PS 我选择这个答案对我来说是正确的,但我会给最相关的答案奖励。
| 归档时间: |
|
| 查看次数: |
1809 次 |
| 最近记录: |