async-validator 說明文檔

異步驗證
驗證表單異步。https://github.com/freeformsystems/async-validate的變體

NPM版本 創建狀態 測試範圍 gemnasium deps 節點版本 npm下載

API
如下是從早期版本的async-validate中修改的。

用法
基本用法包括定義描述符,將其分配給模式,並將要驗證的對象和回調函數傳遞給validate模式的方法:

var schema = require('async-validator');
var descriptor = {
  name: {
    type: "string",
    required: true,
    validator: (rule, value) => value === 'muji',
  },
};
var validator = new schema(descriptor);
validator.validate({name: "muji"}, (errors, fields) => {
  if(errors) {{name : 「 muji 」 },(errors,fields)=> {
   if(errors){
     //驗證失敗,錯誤是全部錯誤的數組
    //字段是由字段名稱鍵入的對象,數組爲
    /每一個字段的/ errors 
    return handleErrors(errors, fields);
  }
  //驗證經過
});

// PROMISE USAGE 
validator.validate({
  name: "muji",
  asyncValidator: (rule, value) => axios.post('/nameValidator', { name: value }),
}, (errors, fields) => {
  if(errors) {
     //驗證失敗,錯誤是全部錯誤的數組
    //字段是由字段名稱鍵入的對象,
    每一個字段返回//錯誤
     return handleErrors(errors, fields);
  }
  //驗證經過
})
  .then(() => {
     //驗證經過
  })
  。catch(({errors,fields})=> {
     return  handleErrors(errors,fields);
  })
Validate
function(source,[ options ],callback):Promise
source:要驗證的對象(必需)。
options:描述驗證處理選項的對象(可選)。
callback:驗證完成時調用的回調函數(必需)。
該方法將返回一個Promise對象,如:

then(),驗證經過
catch({ errors, fields }),驗證失敗,錯誤是全部錯誤的數組,字段是由字段名稱鍵入的對象,其數組爲
Options
first:Boolean,callback當第一個驗證規則生成錯誤時調用,再也不處理驗證規則。若是您的驗證涉及多個異步調用(例如,數據庫查詢),而且您只須要第一個錯誤,請使用此選項。

firstFields:Boolean | String [],callback當指定字段的第一個驗證規則生成錯誤時調用,再也不處理相同字段的驗證規則。 true意味着全部領域。

Rules
規則能夠是執行驗證的函數。

function(rule, value, callback, source, options)
rule:源描述符中與要驗證的字段名稱對應的驗證規則。始終爲其分配一個field屬性,其中包含要驗證的字段的名稱。
value:要驗證的源對象屬性的值。
callback:完成驗證後調用的回調函數。它指望傳遞一組Error實例來指示驗證失敗。若是檢查是同步的,您能夠直接返回false或Error或Error Array。
source:傳遞給validate方法的源對象。
options: 其餘選項。
options.messages:包含驗證錯誤消息的對象將與defaultMessages深度合併。
傳遞給validate或asyncValidate傳遞給驗證函數的選項,以便您能夠在驗證函數中引用瞬態數據(例如模型引用)。可是,保留了一些選項名稱; 若是使用選項對象的這些屬性,則會覆蓋它們。保留的屬性是messages,exception和error。

var schema = require('async-validator');
var descriptor = {
  name(rule, value, callback, source, options) {
    var errors = [];
    if(!/^[a-z0-9]+$/.test(value)) {
      errors.push(
        new Error(
          util.format("%s must be lowercase alphanumeric characters",
            rule.field)));
    }
    return errors;
  }
}
var validator =  new  schema(descriptor);
validator.validate({name : 「 Firstname 」 },(errors,fields)=> {
   if(errors){
     return  handleErrors(errors,fields);
  }
  //驗證經過 
});
針對單個字段測試多個驗證規則一般頗有用,這樣作可使規則成爲對象數組,例如:

var descriptor = {
  email: [
    {type: "string", required: true, pattern: schema.pattern.email},
    {validator(rule, value, callback, source, options) {
       var errors = [];
      //若是電子郵件地址已經存在於數據庫測試
      //並添加驗證錯誤,若是它的錯誤陣列
      return errors;
    }}
  ]
}
Type
指示type要使用的驗證器。已識別的類型值爲:

string:必須是類型string。This is the default type.
number:必須是類型number。
boolean:必須是類型boolean。
method:必須是類型function。
regexp:必須是RegExp建立新項時不生成異常的實例或字符串RegExp。
integer:必須是類型number和整數。
float:必須是類型number和浮點數。
array:必須是由...肯定的數組Array.isArray。
object:必須是類型object而不是Array.isArray。
enum:價值必須存在於enum。
date:值必須有效,由肯定 Date
url:必須是類型url。
hex:必須是類型hex。
email:必須是類型email。
Required
該required規則屬性表示該字段必須存在於源對象被驗證。

Pattern
該pattern規則屬性指示一個正則表達式的值必須匹配,才能經過驗證。

Range
使用min和max屬性定義範圍。對於string和array類型進行比較length,對於number類型,數量不得小於min或大於max。

Enumerable
要驗證字段的確切長度,請指定該len屬性。對於屬性執行string和array類型比較length,對於number類型,此屬性指示徹底匹配number,即,它可能僅嚴格等於len。

若是len屬性與min和max範圍屬性組合,len則優先。

枚舉
要從可能值列表中驗證值,請使用enum帶有enum列出該字段有效值的屬性的類型,例如:

var descriptor = {
   role: {type: "enum", enum: ['admin', 'user', 'guest']}
}
Whitespace
一般將僅包含空格的必填字段視爲錯誤。要爲僅包含空格的字符串添加其餘測試,請將whitespace屬性添加到值爲的規則true。規則必須是一種string類型。

您可能但願清理用戶輸入而不是測試空格,請參閱transform以獲取容許您去除空格的示例。

Deep Rules

若是您須要驗證深對象屬性可能對於那些的驗證規則這樣作object或者array經過向指定嵌套規則類型fields規則的屬性。

var descriptor = {
  addres: {
    type : 「 object 」,requried: true,
    fieds: {
      street : {type : 「 string 」,required : true },
      city : {type : 「 string 」,required : true },
      zip : {type : 「 string 」,required : true,len :8,message : 「 invalid zip 」 }
    }
  },
  name : {type : 「 string 」,required : true }
}
var validator =  new  schema(descriptor);
validator.validate({address : {}},(errors,fields)=> {
   // address.street,address.city,address.zip的錯誤 
});
請注意,若是未required在父規則上指定屬性,則對於不在源對象上聲明的字段徹底有效,而且不會執行深度驗證規則,由於沒有任何要驗證的內容。

深度規則驗證爲嵌套規則建立架構,所以您還能夠指定options傳遞給schema.validate()方法。

var descriptor = {
  address: {
    type: "object", required: true, options: {single: true, first: true},
    fields: {
      street: {type: "string", required: true},
      city: {type: "string", required: true},
      zip: {type: "string", required: true, len: 8, message: "invalid zip"}
    }
  },
  name: {type: "string", required: true}
}
var validator = new schema(descriptor);

validator.validate({ address: {} })
  .catch(({ errors, fields }) => {
     //如今只有街道和名稱的錯誤     
  });
父規則也通過驗證,所以若是您有一組規則,例如:

var descriptor = {
  roles: {
    type: "array", required: true, len: 3,
    fields: {
      0: {type: "string", required: true},
      1: {type: "string", required: true},
      2: {type: "string", required: true}
    }
  }
}
而後提供一個源對象,{roles: ["admin", "user"]}而後建立兩個錯誤。一個用於數組長度不匹配,另外一個用於索引2處缺乏的所需數組條目。

defaultField
該defaultField屬性可與arrayor或objecttype 一塊兒使用,以驗證容器的全部值。它多是一個object或array包含驗證規則。例如:

var descriptor = {
  urls: {
    type: "array", required: true,
    defaultField: {type: "url"}
  }
}
請注意,defaultField擴展爲fields,請參閱深層規則。

Transform 轉變
有時須要在驗證以前轉換值,多是爲了強制價值或以某種方式對其進行消毒。爲此,請transform向驗證規則添加一個函數。該屬性在驗證以前進行轉換,並從新分配給源對象,以便在適當的位置改變屬性的值。

var schema = require('async-validator');
var sanitize = require('validator').sanitize;
var descriptor = {
  name: {
    type: "string",
    required: true, pattern: /^[a-z]+$/,
    transform(value) {
      return sanitize(value).trim();
    }
  }
}
var validator = new schema(descriptor);
var source = {name: " user  "};
validator.validate(source)
  .then(() => assert.equal(source.name, "user"));;
若是沒有transform函數驗證,則因爲模式不匹配而失敗,由於輸入包含前導和尾隨空格,可是經過添加轉換函數驗證過程而且字段值同時被清理。

Messages
根據您的應用程序要求,您可能須要i18​​n支持,或者您可能更喜歡不一樣的驗證錯誤消息。

實現此目的的最簡單方法是爲message規則分配:

{name : {type : 「 string 」,required : true,message : 「 Name is required 」 }}
消息能夠是任何類型,例如jsx格式。

{name : {type : 「 string 」,required : true,message : < b >姓名是必需的< / b > }}
消息也能夠是一個函數,例如,若是你使用vue-i18n:

{name : {type : 「 string 」,required : true,message :()=>  this。$ t('名稱是必需的')}}
您可能須要針對不一樣語言使用相同的架構驗證規則,在這種狀況下,複製每種語言的架構規則是沒有意義的。

在這種狀況下,您只需提供本身的語言消息並將其分配給架構:

var schema = require('async-validator');
var cn = {
  required: '%s 必填',
};
var descriptor = {name:{type: "string", required: true}};
var validator = new schema(descriptor);
// deep merge with defaultMessages
validator.messages(cn);

若是要定義本身的驗證函數,最好將消息字符串分配給消息對象,而後經過options.messages驗證函數中的屬性訪問消息。

asyncValidator
您能夠爲指定字段自定義異步驗證功能:

const fields = {
  asyncField:{
    asyncValidator(rule,value,callback){
      ajax({
        url:'xx',
        value:value
      }).then(function(data){
        callback();
      },function(error){
        callback(new Error(error))
      });
    }
  },

  promiseField:{
    asyncValidator(rule, value){
      return ajax({
        url:'xx',
        value:value
      });
    }
  }
};
validator
您能夠自定義驗證指定字段的功能:

const fields = {
  field:{
    validator(rule,value,callback){
      return value === 'test';
    },
    message: 'Value is not equal to "test".',
  },

  field2:{
    validator(rule,value,callback){
      return new Error(`'${value} is not equal to "test".'`);
    },
  },
 
  arrField:{
    validator(rule, value){
      return [
        new Error('Message 1'),
        new Error('Message 2'),
      ];
    }
  },
};
常問問題
如何避免警告
var Schema = require('async-validator');
Schema.warning = function(){};
測試用例
npm test
npm run chrome-test
覆蓋
npm run coverage
公開報道/目錄

執照
一切都是麻省理工學院。
相關文章
相關標籤/搜索