当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 19:45:25 Node.js

推荐一个Node.js的参数校验模块-minijoi的初衷:使用Joi时,每次校验的时候都要写pattern规则string.trim()。必需的()等等。由于参数校验频繁且必要,写的越来越多,代码既不好看也不便于维护,pattern规则不易记忆,joithrow的错误需要单独处理。所以对于日常生活中最常用的检查,封装了joi的API,调用的时候可以同时传入一个自定义的Error,使用joi友好的错误栈提示信息,并把我们自定义的Error抛在同时,不需要单独处理joiError。于是就有了miniJoi,它是joi的一个简单版本。欢迎问题和PR。代码测试用例位于测试目录中。写好测试用例后,执行命令:pnpmruncoverage(推荐)npmruncoverageyarnruncoverage控制台会输出测试用例和代码覆盖率。开发者还可以对miniJoi进行二次开发,打造更符合自己的应用模块。minijoiconstminiJoi=require('minijoi');miniJoi.requireAndNotEmptyForStr(value,options)options:{error:newError("ThisisanError")//公共模式:/^1[3456789]\d{9}$//emailIDURLphonenamemode:'strict'//phoneversion:'ipv6'//IPgeneration:'first'//ID}友好栈提示,基于Joi,报错纠错验证的参数类型也告诉开发者,开发者可以清楚的看到输入的值和类型,_original字段的值就是输入值,如下:Error[ValidationError]:"value"isnotallowedtobeempty,Butthetype传入的参数是[String],请检查“_original”字段中的值。在Object.exports.process(D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\errors.js:184:16)在Object.internals.entry(D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\validator.js:150:26)在Object.exports.entry(D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\validator.js:27:30)在内部。Base.validate(D:\data\git\minijoi\node_modules\.pnpm\joi@17.4.2\node_modules\joi\lib\base.js:548:26)在对象处验证(D:\data\git\minijoi\apply.js:12:37)。requireAndNotEmptyForStr(D:\data\git\minijoi\apply.js:39:12)在Object.(D:\data\git\minijoi\test.js:101:7)在Module._compile(internal/modules/cjs/loader.js:1072:14)在Object.Module._extensions..js(internal/modules/cjs/loader.js:1101:10)在Module.load(internal/modules/cjs/loader.js:937:32){_original:'',details:[{message:'"value"不允许为空,但传入的参数类型为[String],请检查"_original"中的值field.',path:[],type:'string.empty',context:{label:'value',value:''}}]}Node.js版本要求:支持Node.jsV10,V12,V14,V16API如下:开发者可以自定义Error,调用API时传入error参数即可,miniJoi会自动抛出开发者定义的Error,默认输出以上错误信息该字符串是必需的且不为空requireAndIsEmptyForStr(value,{error:newError("ThisisanError")})需要字符串枚举miniJoi.requireAndEnumForStr(value,["test"])miniJoi.requireAndEnumForStr(value,["test","test1"],{error:newError("ThisisanError")})需要特定长度的字符串})所需字符串最大长度miniJoi.max(value,limit)miniJoi.max(value,limit,{error:newError("ThisisanError")})所需字符串最小长度miniJoi.min(value,limit)miniJoi.min(value,limit,{error:newError("ThisisanError")})requiredstring中文名称miniJoi.name(value)miniJoi.name(value,{error:newError("ThisisanError")})miniJoi.name(value,{pattern:xxxx})如果miniJoi提供的中文姓名验证功能不满足开发者的要求,开发者可以自定义输入正则表达式必须填写字符串和合法邮箱miniJoi.requireEmail(值)miniJoi.requireEmail(值,{error:newError("ThisisanError")})输入模式字段,然后使用patternminiJoi.requireEmail(value,{error:newError("ThisisanError"),pattern:/^1[3456789]\d{9}$/})如果miniJoi提供的邮箱验证功能不满足开发者的要求,开发者可以自定义传入的正则表达式requiredstring,合法电话号码模式字段参考anyruleminiJoi.requirePhone(value)miniJoi。requirePhone(value,{error:newError("ThisisanError")})输入pattern字段,然后使用patternmode'strict'||'loose'strict默认是strict,loose是loose(最松),只要是Juststartwith1miniJoi.requirePhone(value,{error:newError("ThisisanError"),pattern:/^1[3456789]\d{9}$/mode:'strict'})miniJoi提供的电话号码验证功能不符合开发者的要求。开发者可以自定义传入的正则表达式,要求的字符串是合法的。IPminiJoi.requireIP(value)miniJoi.requireIP(value,{error:newError("ThisisanError")})输入pattern字段,然后使用patternversion'ipv4'||'ipv6'ipv4表示只验证ipv4ipv6表示只验证ipv6默认同时验证ipv4和ipv6开发者的要求,开发者可以自定义传入正表达式必须是一个字符串并且是合法的UrlminiJoi.requireUrl(value)miniJoi.requireUrl(value,{error:newError("ThisisanError")})在模式字段中输入,然后使用patternminiJoi.requireUrl(value,{error:newError("ThisisanError"),pattern:/^1[3456789]\d{9}$/})如果miniJoi提供的URL校验功能不满足开发者的要求,开发者可以自定义pass输入正则表达式所需的字符串和合法IDminiJoi.requireID(value)miniJoi.requireID(value,{error:newError("ThisisanError")})输入pattern字段,然后使用patterngeneration:"first"||“二”first表示只验证第一代身份证second表示只验证二代身份证。默认情况下,第一代和第二代的miniJoi.requireID(value,{error:newError("ThisisanError"),pattern:/^1[3456789]\d{9}$/generation:"first"})如果miniJoi提供的身份证验证功能不满足开发者的需求,开发者可以自定义传入的正则表达式为需要的数字miniJoi.requireForNum(value)miniJoi.requireForNum(value,{error:newError("Thisis错误")})需要整数miniJoi.requireForInt(value)miniJoi.requireForInt(value,{error:newError("ThisisanError")})需要数字枚举miniJoi.requireAndEnumForNum(value)miniJoi.requireAndEnumForNum(value,[1,2],{error:newError("ThisisanError")})必填数字小数位不大于limitminiJoi.requireAndPrecision(value)miniJoi.requireAndPrecision(value,limit,{error:newError("这是一个错误")})2.2PASS2.22PASS2.222FAIL所需的数字范围APIminiJoi.requireForRangeNum(value,op,limit)miniJoi.requireForRangeNum(value,op,limit,{error:newError("这是一个错误")})op值为gt(>)||gte(>=)||lt(<)||lte(<=)比如需要参数>0,那么miniJoi.requireForRangeNum(value,"gt",0)可以表示一个正数参数>=0miniJoi.requireForRangeNum(value,"gte",0)参数<=0miniJoi.requireForRangeNum(value,"lte",0)parameter<0miniJoi.requireForRangeNum(value,"lt",0)可以表示负数,必须填写数值范围APIminiJoi.requireForRangeNum(value,op,rangeArr)miniJoi.requireForRangeNum(value,op,rangeArr,{error:newError("ThisisanError")})op的值为left-close-right-close`[0,100]`forshortl-c-r-cleft-close-right-open`[0,100)`是l-c-r-left-open-right-open的缩写`(0,100)`是l-o-r-left-open-right-close`(0,100]`的缩写例如缩写l-o-r-c,要求参数>0且<=100,则miniJoi.requireForRangeNum(value,"左开右闭",[0,100])miniJoi.requireForRangeNum(value,"l-o-r-c",[0,100])例如需要参数>=0和<=100,然后miniJoi.requireForRangeNum(value,"left-close-right-close",[0,100])miniJoi.requireForRangeNum(value,"l-c-r-c",[0,100])例如需要参数>0且<100,则miniJoi.requireForRangeNum(value,"left-open-right-open",[0,100])miniJoi.requireForRangeNum(value,"l-o-r-o",[0,100])例如,如果参数>=0且<100是必需的,然后是miniJoi。requireForRangeNum(value,"left-close-right-open",[0,100])miniJoi.requireForRangeNum(value,"l-c-r-o",[0,100])所需的整数范围APIminiJoi.requireForRangeInt(value,op,limit)miniJoi.requireForRangeInt(value,op,limit,{error:newError("ThisisanError")})op的值为gt(>)||gte(>=)||lt(<)||lte(<=)比如Requireparameter>0,那么miniJoi.requireForRangeInt(value,"gt",0)可以表示一个正整数参数>=0miniJoi.requireForRangeInt(value,"gte",0)parameter<=0miniJoi.requireForRangeInt(value,"lte",0)parameter<0miniJoi.requireForRangeInt(value,"lt",0)可以表示一个负整数必须填写整数范围APIminiJoi.requireForRangeInt(value,op,rangeArr)miniJoi.requireForRangeInt(value,op,rangeArr,{error:newError("ThisisanError")})RequiredBooleanminiJoi.requireForBool(value)miniJoi.requireForBool(value,{error:newError("这是一个错误")})数组是必需的,不能为空("ThisisanError")})对象是必需的并且不是空的空miniJoi.requireAndIsEmptyForObj(value)miniJoi.requireAndIsEmptyForObj(value,{error:newError("ThisisanError")})