異步驗證 驗證表單異步。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 根據您的應用程序要求,您可能須要i18n支持,或者您可能更喜歡不一樣的驗證錯誤消息。 實現此目的的最簡單方法是爲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 公開報道/目錄 執照 一切都是麻省理工學院。