2014-09-22 79 views

回答

1

據我所知,在模型聲明中沒有辦法做到這一點。但是,您可以在「beforeValidate」回調中輕鬆完成。

如果您在代碼段here的註釋中註明,將任何內容傳遞給生命週期回調中的回調將觸發錯誤,因此只需要這一小段代碼即可驗證數組僅包含字符串:

beforeValidate: function (values, cb) { 

    values.arrOfStrings.forEach(function(str) { 
    if (typeof(str) != "string") { 
     cb("err: arrOfStrings must contain only strings"); 
    } 
    } 

    cb() 
} 
+0

注:這是異步,所以這些潛在的回調都將被調用。 JS引擎會繼續執行forEach,調用'cb()',並且數組中的最後一項觸發不等式 - 現在'cb'被調用兩次。因此,如果你想讓引擎停留在迭代直到完成,你可以將它重構爲'for(i)'循環。 – Cody 2015-07-04 16:54:27

2

看來,這可以通過添加自定義類型的模型(Waterline readme描述)來完成:需要

module.exports = { 
    types: { 
     stringArray: function(array){ 
      if (!Array.isArray(array)) { 
       return false; 
      } else { 
       return array.every(function (value) { 
        return typeof(value) === "string" 
       }); 
      } 
     } 
    }, 
    attributes: { 
     someArrayOfStrings : { 
      type: 'array', 
      stringArray: true 
     } 
    } 
}; 

自定義驗證碼,但至少這種方法適用於驗證引擎並允許在模型中進行聲明性驗證。

+1

數組類型有點不對?每次使用時需要檢查類型。 :/ – Kefka 2015-12-28 17:59:10

0

由於HolySamosa,指出(但我會在文檔中末附上更詳細的網頁)

自定義的驗證

您可以定義自己的類型及其與類型的驗證目的。可以訪問和比較其他屬性的值。這使您可以將驗證業務邏輯移入您的模型並從您的控制器邏輯中移出。

var User = Waterline.Collection.extend({ 
    types: { 
    point: function(latlng){ 
     return latlng.x && latlng.y 
    }, 

    password: function(password) { 
     return password === this.passwordConfirmation; 
    }); 
    }, 

    attributes: { 
    firstName: { 
     type: 'string', 
     required: true, 
     minLength: 5, 
     maxLength: 15 
    }, 

    location: { 
     type: 'json', 
     point: true 
    }, 

    password: { 
     type: 'string', 
     password: true 
    }, 

    passwordConfirmation: { 
     type: 'string' 
    } 
    } 
}); 

,以便在上面的例子中,你可以使用HolySamosa的功能以及。使用了`forEach`是

https://github.com/balderdashy/waterline-docs/blob/master/models/validations.md