2016-07-15 189 views
1

我已经建立了这样的模式如何验证类型和值。猫鼬,当更新/ findOneAndUpdate

它工作正常的创作。如果缺少必需或错误的类型,它会引发验证错误。因此,将检查这两个类型和值(如果我增加额外的验证函数来验证每个字段中的值)

然而,当我尝试更新或findOneAndUpdate。我已经将runValidators设置为true。它以某种方式工作,但它只会验证是否需要丢失。但它没有验证类型,可能会自动将我的类型转换为格式。

e.g如果我设置isAction(希望是布尔值)为整数时,它会自动转换成布尔值false。所以它有点绕过了类型验证。然后它将进入已经布尔的验证器功能,但我希望它应该在输入验证函数之前抛出验证错误。

另一个问题是数组和对象。它没有验证对象中深度属性的类型,并直接进入验证函数。

所以我想看看是否有更好的方式来验证这两种类型和值正确时更新/ findOneAndUpdate。

我已经搜索了一些猫鼬验证模块,但其中大多数都是帮助每个字段的验证功能。所以这些数据已经从整数转换为布尔值,并且当时无法检查类型。

此时,我只能想到在插入/更新到猫鼬之前验证类型和值。

const schema = new mongoose.Schema({{ 
 
    id: { 
 
     type: String, 
 
     unique: true, 
 
     required: true, 
 
    }, 
 
    address: { 
 
     formatted: String, 
 
     streetAddress: String, 
 
     locality: String, 
 
     region: String, 
 
     postalCode: String, 
 
     country: String, 
 
    }, 
 
    isActive: Boolean, 
 
    }); 
 

 
const user = mongoose.model('User', schema); 
 

 
// this one work with the validation on the type 
 
User.create({ id : 'userA' }, (err) => { 
 
    console.log(err); 
 
}); 
 

 
// fail to validate the type on both findOneAndUpdate 
 
User.update({ id:'userA'},{ $set: { address:12313 }}, { runValidators: true}, (err) => { 
 
    console.log(err); 
 
});

回答

0

本文https://www.mongodb.com/blog/post/introducing-version-40-mongoose-nodejs-odm约猫鼬验证详细讨论。

不看请在部分前置和后置挂钩查询,其中列出了猫鼬4功能前置和后置挂钩计数(),发现(),findOne(),findOneAndUpdate(),和update() 。

希望它帮助!

+0

但是,前,后钩的上下文是模型本身。即使我们可以得到查询,但我需要手动检查和验证数据类型,我希望猫鼬根据模式定义的数据类型自动执行,并像创建一个新数据类型一样行为。 如果是这样,为什么不手动更新数据之前自己执行验证。 顺便说一句,感谢您的帮助。 –