举荐一个Node.js参数校验模块 - minijoi

初衷:

因为在应用 Joi 的时候,校验时每次都要写模式规定 string.trim().required() 等等。因为参数校验是频繁且必须的,写的越来越多,代码既不难看,也不好保护,模式规定也不好记忆,并且 joi throw 的谬误还须要独自去解决。所以对日常最罕用的校验,封装了joi的API,并且能够在调用的时候同时传入自定义的Error,应用 joi 敌对的报错堆栈提示信息 同时 throw 咱们自定义的Error, 无须再独自解决 joi 的 Error。所以就有了 miniJoi ,就是简略版的joi

欢送提 Issue 和 PR , 代码的测试用例在tests目录下,写好测试用例,执行命令为:

pnpm run coverage(举荐)npm run coverageyarn run coverage

控制台会输入用例状况和代码覆盖率。开发者也能够对 miniJoi 进行二次开发,打造更合乎本人利用模块。

minijoi

const miniJoi = require('minijoi');miniJoi.requireAndNotEmptyForStr(value , options)options : {    error : new Error("This is an Error")  //私有    pattern : /^1[3456789]\d{9}$/    // email ID   URL  phone  name    mode : 'strict'     //phone    version : 'ipv6'    //IP    generation : 'first'  //ID}

敌对的堆栈提醒,在Joi的根底上,报错的同时把要校验的参数类型也一起通知给开发者,开发者能够分明的看到输出的值和类型, _original 字段的值就是输出的值,如下:

Error [ValidationError]: "value" is not allowed to be empty, But the type of the argument passed in is [String], Please check the value in the "_original" field.    at Object.exports.process (D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\errors.js:184:16)    at Object.internals.entry (D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\validator.js:150:26)    at Object.exports.entry (D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\validator.js:27:30)    at internals.Base.validate (D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\base.js:548:26)    at validate (D:\data\git\minijoi\apply.js:12:37)    at Object.requireAndNotEmptyForStr (D:\data\git\minijoi\apply.js:39:12)    at Object.<anonymous> (D:\data\git\minijoi\test.js:101:7)    at Module._compile (internal/modules/cjs/loader.js:1072:14)    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)    at Module.load (internal/modules/cjs/loader.js:937:32) {  _original: '',  details: [    {      message: '"value" is not allowed to be empty, But the type of the argument passed in is [String], Please check the value in the "_original" field.',      path: [],      type: 'string.empty',      context: { label: 'value', value: '' }    }  ]}

Node.js版本要求:

反对 Node.js V10,V12, V14, V16

API如下:

开发者可自定义 Error ,调用API时传 error 参数就能够了,miniJoi 会主动抛出开发者自定义 Error,默认输入下面的错误信息。

字符串必填且非空

miniJoi.requireAndNotEmptyForStr(value)miniJoi.requireAndNotEmptyForStr(value , {error : new Error("This is an Error")})

字符串必填能够为空

miniJoi.requireAndIsEmptyForStr(value)miniJoi.requireAndIsEmptyForStr(value , {error : new Error("This is an Error")})

必填字符串枚举

miniJoi.requireAndEnumForStr(value , ["test"])miniJoi.requireAndEnumForStr(value , ["test","test1"] , {error : new Error("This is an Error")})

必填字符串特定长度

miniJoi.length(value , limit)miniJoi.length(value , limit , {error : new Error("This is an Error")})

必填字符串最大长度

miniJoi.max(value , limit)miniJoi.max(value , limit , {error : new Error("This is an Error")})

必填字符串最小长度

miniJoi.min(value , limit)miniJoi.min(value , limit , {error : new Error("This is an Error")})

必填字符串中文姓名

miniJoi.name(value )miniJoi.name(value , {error : new Error("This is an Error")})miniJoi.name(value , {pattern : xxxx})如miniJoi提供的中文姓名校验性能不合乎开发者的要求,开发者可自定义传入正则表达式

必填字符串且非法邮箱

miniJoi.requireEmail(value )miniJoi.requireEmail(value , {error : new Error("This is an Error")})输出pattern字段,则应用patternminiJoi.requireEmail(value , {        error : new Error("This is an Error"),        pattern : /^1[3456789]\d{9}$/    })    如miniJoi提供的邮箱校验性能不合乎开发者的要求,开发者可自定义传入正则表达式    

必填字符串且非法电话号码 mode字段参考 anyrule

miniJoi.requirePhone(value )miniJoi.requirePhone(value , {error : new Error("This is an Error")})输出pattern字段,则应用patternmode 'strict'||'loose'strict 示意谨严loose 示意宽松默认为(最宽松), 只有是1结尾即可miniJoi.requirePhone(value , {        error : new Error("This is an Error"),        pattern : /^1[3456789]\d{9}$/        mode : 'strict'    })    如miniJoi提供的电话号码校验性能不合乎开发者的要求,开发者可自定义传入正则表达式

必填字符串且非法IP

miniJoi.requireIP(value )miniJoi.requireIP(value , {error : new Error("This is an Error")})输出pattern字段,则应用patternversion 'ipv4'||'ipv6'ipv4 示意只校验ipv4ipv6 示意只校验ipv6默认同时校验ipv4和ipv6miniJoi.requireIP(value , {        error : new Error("This is an Error"),        version : 'ipv6'    })    如miniJoi提供的IP校验性能不合乎开发者的要求,开发者可自定义传入正则表达式

必填字符串且非法Url

miniJoi.requireUrl(value )miniJoi.requireUrl(value , {error : new Error("This is an Error")})输出pattern字段,则应用patternminiJoi.requireUrl(value , {        error : new Error("This is an Error"),        pattern : /^1[3456789]\d{9}$/    })如miniJoi提供的Url校验性能不合乎开发者的要求,开发者可自定义传入正则表达式

必填字符串且非法身份证

miniJoi.requireID(value )miniJoi.requireID(value , {error : new Error("This is an Error")})输出pattern字段,则应用patterngeneration : "first" || "second"first 示意只校验一代身份证second 示意只校验二代身份证默认同时校验一代和二代miniJoi.requireID(value , {        error : new Error("This is an Error"),        pattern : /^1[3456789]\d{9}$/        generation : "first"    })    如miniJoi提供的身份证校验性能不合乎开发者的要求,开发者可自定义传入正则表达式

必填数字

miniJoi.requireForNum(value)miniJoi.requireForNum(value , {error : new Error("This is an Error")})

必填整数

miniJoi.requireForInt(value)miniJoi.requireForInt(value , {error : new Error("This is an Error")})

必填数字枚举

miniJoi.requireAndEnumForNum(value)miniJoi.requireAndEnumForNum(value ,[1,2], {error : new Error("This is an Error")})

必填数字小数位不大于 limit 位

miniJoi.requireAndPrecision(value)miniJoi.requireAndPrecision(value , limit , {error : new Error("This is an Error")})2.2 PASS2.22 PASS2.222 FAIL

必填数字范畴API

miniJoi.requireForRangeNum(value ,op, limit )miniJoi.requireForRangeNum(value ,op, limit , {error : new Error("This is an Error")})op的值为 gt(>) || gte(>=) || lt(<) || lte(<=)比方须要参数 > 0 , 则miniJoi.requireForRangeNum(value ,"gt" , 0 )   可代表负数参数 >= 0miniJoi.requireForRangeNum(value ,"gte" , 0 )参数 <= 0miniJoi.requireForRangeNum(value ,"lte" , 0 )参数 < 0miniJoi.requireForRangeNum(value ,"lt" , 0 )  可代表正数必填数字范畴APIminiJoi.requireForRangeNum(value ,op, rangeArr )miniJoi.requireForRangeNum(value ,op, rangeArr , {error : new Error("This is an Error")})op的值为 left-close-right-close `[0,100]`   简称l-c-r-cleft-close-right-open `[0,100)`   简称 l-c-r-oleft-open-right-open `(0,100)`     简称 l-o-r-oleft-open-right-close `(0,100]`     简称 l-o-r-c比方须要参数 > 0 and <= 100 , 则miniJoi.requireForRangeNum(value ,"left-open-right-close" , [0,100] )miniJoi.requireForRangeNum(value ,"l-o-r-c" , [0,100] )比方须要参数 >= 0 and <= 100 , 则miniJoi.requireForRangeNum(value ,"left-close-right-close" , [0,100] )miniJoi.requireForRangeNum(value ,"l-c-r-c" , [0,100] )比方须要参数 > 0 and < 100 , 则miniJoi.requireForRangeNum(value ,"left-open-right-open" , [0,100] )miniJoi.requireForRangeNum(value ,"l-o-r-o" , [0,100] )比方须要参数 >= 0 and < 100 , 则miniJoi.requireForRangeNum(value ,"left-close-right-open" , [0,100] )miniJoi.requireForRangeNum(value ,"l-c-r-o" , [0,100] )

必填整数范畴API

miniJoi.requireForRangeInt(value ,op, limit )miniJoi.requireForRangeInt(value ,op, limit , {error : new Error("This is an Error")})op的值为 gt(>) || gte(>=) || lt(<) || lte(<=)比方须要参数 > 0 , 则miniJoi.requireForRangeInt(value ,"gt" , 0 )   可代表正整数参数 >= 0miniJoi.requireForRangeInt(value ,"gte" , 0 )参数 <= 0miniJoi.requireForRangeInt(value ,"lte" , 0 )参数 < 0miniJoi.requireForRangeInt(value ,"lt" , 0 )  可代表负整数必填整数范畴API  miniJoi.requireForRangeInt(value ,op, rangeArr )miniJoi.requireForRangeInt(value ,op, rangeArr , {error : new Error("This is an Error")})

必填布尔

miniJoi.requireForBool(value)miniJoi.requireForBool(value , {error : new Error("This is an Error")})

数组必填且非空

miniJoi.requireAndNotEmptyForArr(value)miniJoi.requireAndNotEmptyForArr(value , {error : new Error("This is an Error")})

数组必填能够为空

miniJoi.requireAndIsEmptyForArr(value)miniJoi.requireAndIsEmptyForArr(value , {error : new Error("This is an Error")})

对象必填且非空

miniJoi.requireAndNotEmptyForObj(value)miniJoi.requireAndNotEmptyForObj(value , {error : new Error("This is an Error")})

对象必填能够为空

miniJoi.requireAndIsEmptyForObj(value)miniJoi.requireAndIsEmptyForObj(value , {error : new Error("This is an Error")})