2013-02-11 15 views
5

Tôi có một lược đồ như thế này:Tại sao tôi không thể xác thực tài liệu được nhúng trong mongoose? Cách đúng để làm điều này là gì?

var testSchema = new Schema({ 
     foo: { type: String, required: true, trim: true }, 
     bar: { 
      fooBar: { type: String }, 
      barFoo: { type: String } 
     } 
}); 

Và tôi phải xác nhận giá trị của bar dựa trên foo giá trị, một cái gì đó như thế này:

testSchema.path("bar").validate(function(bar){ 
    if(this.foo === "someValue") 
     //return custom validation logic 1 
    else if(this.foo === "anotherString") 
     //return custom validation logic 2 
    else 
     return false; 
}); 

Nhưng khi tôi cố gắng chiến thuật ứng dụng của tôi tôi nhận được lỗi sau:

/Users/Renato/github/local/prv/domain/models/testModel.js:34 
testSchema.path("bar").validate(function(bar){ 
        ^
TypeError: Cannot call method 'validate' of undefined 

Tôi đang làm gì sai ở đây? Whats cách chính xác để xác nhận đối tượng này ??? Tôi googled cho nó nhưng tôi dường như không thể tìm thấy bất cứ điều gì ra! Ngay cả cập nhật phiên bản mongoose tôi để ~3.5.5

Trả lời

6

Mongoose doesn't appear to consider'bar' là một path chính nó, nhưng thay vì chỉ là một prefix cho 2 con đường riêng - 'bar.fooBar''bar.barFoo':

testSchema.path("bar.fooBar").validate(function(fooBar){ 
    if(this.foo === "someValue") 
     //return custom validation logic 1 
    else 
     return false; 
}); 

testSchema.path("bar.barFoo").validate(function(barFoo){ 
    if(this.foo === "anotherString") 
     //return custom validation logic 2 
    else 
     return false; 
}); 

Bạn cũng có thể tìm schema.pre() có ích để xác thực mô hình chung (ví dụ khác có thể được tìm thấy trong tài liệu Sub Docs):

testSchema.pre('save', function (next) { 
    if(this.foo === "someValue") 
     return next(new Error('Invalid 1')); 
    else if(this.foo === "anotherString") 
     return next(new Error('Invalid 2')); 
    else 
     next(); 
}); 
+0

Vâng, tuyệt vời, điều đó đã làm được điều đó! Cảm ơn! – renatoargh

+1

Tôi có cùng một vấn đề với việc tạo và cập nhật, nếu tôi làm 'testModel.create ({foo: {foobar: 'foo'}})' nó không hoạt động, có cách giải quyết nào không? @ jonathan-lonowski – kilianc

Các vấn đề liên quan