2016-03-02 55 views
0

我需要檢查必填字段,但有些情況下。我想以下幾點:以下列方式驗證字段是否正確?

var PostSchema = mongoose.Schema({}); 

PostSchema.pre('validate', function (next) { 
    var error = new ValidationError(this); 

    if (this.type === 'question' && !Array.isArray(this.tags)) { 
     error.errors.tags = new ValidatorError({message: 'Tags field is required', type: 'required', path: 'tags'}); 
    } 

    if (!Object.keys(error.errors).length) { 
     return next(); 
    } else { 
    return next(error); 
    } 
}); 

是否正確進行驗證上面的方法,並沒有它在未來的突破獴?

回答

1

mongoose doc,Validation是內部件middleware。我認爲這是正確的,使驗證像你一樣,我也有以下代碼

var PostSchema = mongoose.Schema({ 
    type: String, 
    tags: String, 
}); 

PostSchema.pre('validate', function (next) { 
    var error = new ValidationError(this); 

    if (this.type === 'question' && !Array.isArray(this.tags)) { 
     error.errors.tags = new ValidationError({message: 'Tags field is required', type: 'required', path: 'tags'}); 
    } 

    if (!Object.keys(error.errors).length) { 
     return next(); 
    } else { 
     return next(error); 
    } 
}); 

var Post = mongoose.model('Post', PostSchema); 

var p = new Post({ 
    type: 'question', 
    tags: 'abc' 
}); 

p.save(function(err) { 
    if (err) 
     console.log(err); 
    else 
     console.log('save post successfully'); 
}); 

由於tags不是Array測試它,它會觸發validate和錯誤如下圖所示

{ [ValidationError: Post validation failed] 
    message: 'Post validation failed', 
    name: 'ValidationError', 
    errors: 
    { tags: 
     { [ValidationError: Validation failed] 
     message: 'Validation failed', 
     name: 'ValidationError', 
     errors: {} } } } 

由於Validation是一個內部中間件,因此可以將它添加到代碼中,並且不會打斷貓鼬,只有當這個中間件不會從貓鼬中移除時。

順便說一下,在這篇文章中Handling Mongoose validation errors – where and how?,this answer也給出了類似的代碼在這裏。

+0

謝謝,求助! – Erik

+0

你在你的項目中使用貓鼬? – Erik

+0

@Erik,是的,我的項目中使用了貓鼬。 – zangw