watsons是被prop-types启发的,一个强大的参数验证及JSON schema验证模块。具有代码量低,可扩展性极强,效率极高的特点,支持node6及以上。使用方法类似prop-types,例子如下:
const watsons = require('watsons.js')
const obj = {
s: "string value",
n: 3,
a: [1, 2, 3, 4],
e: "female",
shape: {
a: 100,
b: [1, 2, true]
},
nullableString: null,
place: "New York"
}
const checker = {
s: watsons.string,
b: watsons.bool,
n: watsons.number.required,
a: watsons.arrayOf(
watsons.number
),
e: watsons.oneOf(["male", "female"]),
shape: watsons.shape({
a: watsons.number.required,
b: watsons.array.required
}),
nullableString: watsons.oneOfType([
watsons.string,
watsons.null
]).required,
place: watsons.validateWith((v) => v === "New York")
}
watsons.validate(obj, checker) // will not throw
github地址:https://github.com/zhangkaiyulw/watsons
安装方式:
npm install watsons.js
前排水果瓜子
不值得
这个和 joi 相比 有什么不同的吗?
@ipengyo 问的不错。watsons内核很小,提供的功能相当基本,但扩展相当容易,甚至样本代码和测试代码中直接包含相当好用的扩展,但by design,没必要写到内核里。api跟react的proptypes一样,在react日益盛行的今天,多套不同api的验证系统也让人觉得冗余。
watsons.js跟Joi是及其相似但有明显差异的。
设计上来说,无论watsons.string.min(3).max(5)
,还是watsons.string.lengthIn(3, 5)
,watsons都不提供,API由用户自己根据自己习惯去设计。包内太多的功能,对于绝大多数用户来说,也是冗余的,比如说watsons不提供watsons.string.match(/matcher/)这样的功能,但相当容易实现,且样本代码里就有它的实现,这种常用的约定俗成的,完全可以写一个watsons-validators包。
API美感的问题:watsons.string.required, Joi.string().required(), PropTypes.string.isRequired,孰美?
watsons用起来相当自由,如果你想,watsons.required.string, watsons.optional.string, watsons.any.string都是可以的,虽然不建议这样使用,watsons不支持optional关键字,但可以自己添加,默认状态下,没有require都是optional的。
添加方式如下:
let emptyFunc = function(){};
watsons.addValidator("optional", emptyFunc);
本身watsons的API跟react的PropTypes是一模一样的。如果react16或17允许替换掉PropTypes,直接使用watsons,这样watsons可以同时用在组件验证,表单验证,后端post params验证,甚至数据库的数据schema验证,就能够做到学习一次,到处使用,这也是全栈工程师日见增多的今天,开源组件所需要做到的。
顶
这个和我写的validator类似呢 https://cnodejs.org/topic/59f0afd928137001719a821d
@mengdu 是的,我看到了你的帖子很喜欢。已知方案有joi,你的validator,还有这个最轻量的watsons
@mengdu 又看了一下,你的那个适合表单验证,很好用,生成form validating message。