我正在尝试验证一些将插入到新文档中的数据,但在许多其他事情需要发生之前不会。所以我打算在静态方法中添加一个函数,希望根据模型模式验证数组中的对象。
到目前为止,这是代码:
module.exports = Mongoose => {
const Schema = Mongoose.Schema
const peopleSchema = new Schema({
name: {
type: Schema.Types.String,
required: true,
minlength: 3,
maxlength: 25
},
age: Schema.Types.Number
})
/**
* Validate the settings of an array of people
*
* @param {array} people Array of people (objects)
* @return {boolean}
*/
peopleSchema.statics.validatePeople = function( people ) {
return _.every(people, p => {
/**
* How can I validate the object `p` against the peopleSchema
*/
})
}
return Mongoose.model( 'People', peopleSchema )
}
所以peopleSchema.statics.validatePeople
是我尝试进行验证的地方。我已经阅读了mongooses validation文档,但没有说明如何在不保存数据的情况下验证模型。
这可能吗?
这里的答案之一向我指出了正确的验证方法,这种方法似乎有效,但现在却抛出Unhandled rejection ValidationError
。
下面是用于验证数据的静态方法(没有插入它)
peopleSchema.statics.testValidate = function( person ) {
return new Promise( ( res, rej ) => {
const personObj = new this( person )
// FYI - Wrapping the personObj.validate() in a try/catch does NOT suppress the error
personObj.validate( err => {
if ( err ) return rej( err )
res( 'SUCCESS' )
} )
})
}
然后我试试看它:
People.testValidate( { /* Data */ } )
.then(data => {
console.log('OK!', data)
})
.catch( err => {
console.error('FAILED:',err)
})
.finally(() => Mongoose.connection.close())
使用不遵循架构规则的数据进行测试会抛出错误,正如您所看到的,我尝试捕获它,但它似乎无法正常工作。
P.S。我使用Bluebird作为我的承诺
答案 0 :(得分:2)
通过Custom validators
有一种方法可以做到这一点。验证失败时,无法将文档保存到DB中。
var peopleSchema = new mongoose.Schema({
name: String,
age: Number
});
var People = mongoose.model('People', peopleSchema);
peopleSchema.path('name').validate(function(n) {
return !!n && n.length >= 3 && n.length < 25;
}, 'Invalid Name');
function savePeople() {
var p = new People({
name: 'you',
age: 3
});
p.save(function(err){
if (err) {
console.log(err);
}
else
console.log('save people successfully.');
});
}
或者通过validate()
以您定义的相同模式执行此操作。
var p = new People({
name: 'you',
age: 3
});
p.validate(function(err) {
if (err)
console.log(err);
else
console.log('pass validate');
});
答案 1 :(得分:1)
如猫鼬文档https://mongoosejs.com/docs/validation.html中的解释,您可以使用doc.validate(callback)
或doc.validateSync()
来检查验证。
区别在于,await
不必使用validateSync()
,顾名思义。如果验证失败,则返回错误,否则返回undefined
。
例如:
const model = new Model({somedata:somedata})
const validatedModel = model.validateSync()
if(!!validatedModel) throw validatedModel