2014-09-22 36 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