根据Mongoose模式验证对象而不保存为新文档

时间:2016-01-31 02:55:14

标签: node.js mongodb validation mongoose-schema

我正在尝试验证一些将插入到新文档中的数据,但在许多其他事情需要发生之前不会。所以我打算在静态方法中添加一个函数,希望根据模型模式验证数组中的对象。

到目前为止,这是代码:

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作为我的承诺

2 个答案:

答案 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