共计 6959 个字符,预计需要花费 18 分钟才能阅读完成。
举荐一个 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 coverage
yarn 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 字段,则应用 pattern
miniJoi.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 字段,则应用 pattern
mode '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 字段,则应用 pattern
version 'ipv4'||'ipv6'
ipv4 示意只校验 ipv4
ipv6 示意只校验 ipv6
默认同时校验 ipv4 和 ipv6
miniJoi.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 字段,则应用 pattern
miniJoi.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 字段,则应用 pattern
generation : "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 PASS
2.22 PASS
2.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) 可代表负数
参数 >= 0
miniJoi.requireForRangeNum(value ,"gte" , 0)
参数 <= 0
miniJoi.requireForRangeNum(value ,"lte" , 0)
参数 < 0
miniJoi.requireForRangeNum(value ,"lt" , 0) 可代表正数
必填数字范畴 API
miniJoi.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-c
left-close-right-open `[0,100)` 简称 l-c-r-o
left-open-right-open `(0,100)` 简称 l-o-r-o
left-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) 可代表正整数
参数 >= 0
miniJoi.requireForRangeInt(value ,"gte" , 0)
参数 <= 0
miniJoi.requireForRangeInt(value ,"lte" , 0)
参数 < 0
miniJoi.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")})