使用watsons来验证用户端传来的params或json schema
发布于 7 年前 作者 cheunghy 3483 次浏览 来自 分享

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
9 回复

前排水果瓜子

这个和 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验证,就能够做到学习一次,到处使用,这也是全栈工程师日见增多的今天,开源组件所需要做到的。

@mengdu 是的,我看到了你的帖子很喜欢。已知方案有joi,你的validator,还有这个最轻量的watsons

@mengdu 又看了一下,你的那个适合表单验证,很好用,生成form validating message。

回到顶部