Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
check-data
Advanced tools
npm install check-data --save
let Validator = require('check-data')
let { error, data } = Validator(data, options, extend)
data
Objcte, Array, String, Number, Date, Boolean - 输入待验证数据
options
Objcte, Array, Function - 数据验证表达式,类型参考type选项。
extend
Objcte - 自定义数据构建对象,根据输入数据生成新的数据结构(可选)
extend.$name
Function - 数据扩展函数,基于已验证的数据构建新的数据结构,输出结果将以函数名作为key保存到返回值的data中。函数中this和第一个入参指向data(已存在的同名属性值会被函数返回值覆盖)
extend.$name
* - 数据扩展,除函数外的其它任意数据类型,在已验证的数据结构上添加新的属性或覆盖已存在的同名属性
返回值是基于约定的对象结构,error和data属性不会同时存在,验证成功返回data,验证失败返回error和msg
data
* - 经过验证、处理后导出数据,内置空值过滤,自动剔除对象、数组中的空字符串、undefind值。(更多空值过滤特性请参考filter-null模块)
error
String - 验证失败时返回的错误信息,包含错误的具体位置信息,仅供开发者调试使用
msg
String - 验证失败后返回的错误信息,相对于error而言,msg对用户更加友好,可直接在客户端显示
options数据验证表达式支持无限嵌套,不管你的数据层级有多深。整体数据结构与待验证数据结构基本保持一致,除了使用type对象表达式不得不增加额外的数据结构。
验证表达式中判断一个对象节点是否为验证选项的唯一依据是检查对象中是否包含type属性,如果没有type则被视为对象结构。
type作为验证表达式的内部保留关键字,应尽量避免在入参中包含同名的type属性,否则可能导致验证结果出现混乱。
type
* - 数据类型
default
* - 空值时的默认赋值
set
Function - 赋值函数,用于对输入值处理后再输出赋值,函数中this指向原始数据data,当值为空时不执行(原method方法)
value
* - 直接通过表达式赋值,类似于default选项,区别是不管值是否为空都将使用该值覆盖(优先级低于default,目前没有发现同时使用的应用场景)
allowNull
Boolean - 是否允许为空(默认将undefined和空字符串被视为空),缺省值为true。当值为false时,必须正确匹配指定的数据类型,否则会提示数据类型错误。
ignore
Array - 忽略指定的值,在字段级覆盖对默认空值的定义,如将某个指定字段的空值定义为[null, ""]
and
Array、Function - 声明依赖的参数名数组,支持数组和函数两种表达式,函数表达式用于声明指定值的依赖关系。要求依赖的所有参数都不能为空(注意:这里的and用于依赖判断,如参数a必须依赖参数b构成一个完整的数据,那么就要将参数b加入到and的数组中建立依赖关系)
or
Array、Function - 与and相似,区别是只要求依赖的其中一个参数不为空即可
name
String - 参数名称,为参数名定义一个更易于理解的别名,在返回错误描述文本中会优先使用该别名替换属性名
针对不同的数据类型,会有不同的可选参数,选项如下
minLength
Number - 限制字符串最小长度
maxLength
Number - 限制字符串最大长度
reg
RegExp - 正则表达式验证
in
Array - 匹配多个可选值中的一个
min
Number - 限制最小值
max
Number - 限制最大值
in
Array - 匹配多个可选值中的一个
minLength
Number - 限制字符串最小长度
maxLength
Number - 限制字符串最大长度
仅支持类型验证
仅支持类型验证
验证mongodb中的ObjectId
验证手机号
验证Email
验证器中只内置了一部分常用的数据类型,如果不能满足你的需求,可以通过Validator.use()自行扩展,使用时和扩展类型一样,用类型名称字符串声明数据类型
Validator.use(name, options)
name
String - 类型名称(必填)
options
Object - 类型选项(必填)
options.type
Function - 数据类型验证函数(必填)
options.$name
Function - 其它验证函数(可选)
Validator.use('Int', {
type({ data }) {
if (Number.isInteger(data)) {
return { data }
} else {
return { error: '必须为Int类型' }
}
},
max({ data, option: max }) {
if (data > max) {
return { error: `不能大于${max}` }
} else {
return { data }
}
},
in({ data, option: arr }) {
let result = arr.indexOf(data)
if (result === -1) {
return { error: `值必须为${arr}中的一个` }
} else {
return { data }
}
}
})
通过预定义schema,实现options单例复用(option为静态数据),避免频繁创建重复的实例,可节省内存和减少计算开销。在环境允许的情况下应优先考虑schema方式。
Validator.schema(name, options)
name
String - schema名称
options
* - 验证表达式
let schema = Validator.schema('demo', {
a: {
a1: {
type: Number,
allowNull: false
},
a2: {
type: Number,
allowNull: false
}
},
b: Number,
})
let json = {
a: {
a1: "jj",
a2: "12",
},
b: 2,
c: 888,
}
let { error, data } = schema(json)
// 或
let { error, data } = Validator.demo(json)
// 一维数组
let { error, data } = Validator(["a", "b", "c"], [String])
// 内嵌对象
let { error, data } = Validator([{
"a":1,
"b":"bibi",
"c":"test"
},{
"a":1,
"b":"bibi",
"c":"test"
}], [{
a: Number,
b: String,
c: String
}])
let { error, data } = Validator({
"a": 1,
"b": "xx",
"c": [1,32,34],
"d": 666
}, {
"a": Number,
"b": String,
"c": [String],
"d": Number
})
let { error, data } = Validator({
"username": "莉莉",
"addressee": "嘟嘟",
}, {
"username": {
"type": String,
// 使用数组表达式
"and": ["addressee", "address"],
},
"addressee": {
"type": String,
"allowNull": true
},
"address": {
"type": String,
"allowNull": true,
// 使用函数表达式,表示特定值的依赖关系
and(value){
if (value === 1) {
return ["addressee", "address"]
} else if (value === 2) {
return ["username", "xx"]
}
},
}
})
let { error, data } = Validator({
"username": "莉莉",
"addressee": "嘟嘟",
}, {
"username": {
"type": String,
"or": ["addressee", "address"]
},
"addressee": {
"type": String,
"allowNull": true
},
"address": {
"type": String,
"allowNull": true
}
})
let { error, data } = Validator({
"id": "5968d3b4956fe04299ea5c18",
"mobilePhone": "18555555555",
}, {
"id": "MongoId",
"mobilePhone": "MobilePhone"
})
// 输入数据
let json = {
"username": "测试",
"num": "123456789987",
"time": "2017-07-07T09:53:30.000Z",
"files": ["abc.js", "334", "null", "666", , , "kkk.js"],
"user": {
"username": "莉莉",
"age": 18,
},
"list": [
{
"username": "吖吖",
"age": 16,
},
{
"username": "可可",
"age": 15,
}
],
"auth": {
"weixin": "abc",
},
"beneficiariesName": "莉莉",
"guaranteeMoney": 2,
"guaranteeFormat": 0,
"addressee": "嘟嘟",
"receiveAddress": "北京市",
"phone": "18666666666",
"coupon": "uuuu",
"integral": {
"lala": 168,
"kaka": "3"
},
"search": "深圳",
"email": "xxx@xx.xx"
}
// 验证表达式
let { error, data } = Validator(json,
{
"username": {
"type": String,
"name": "用户名",
"allowNull": false
},
"num": String,
"time": {
"type": Date,
"name": "时间",
"allowNull": false,
},
"user": {
"username": String,
"age": Number,
},
"list": [{
"username": String,
"age": Number,
}],
"auth": {
"weixin": String,
},
"beneficiariesName": String,
"guaranteeMoney": {
"type": Number,
"in": [1, 2]
},
"files": [{
"type": String,
"allowNull": false,
}],
"guaranteeFormat": {
"type": Number,
"conversion": Boolean
},
"addressee": {
"type": String,
"value": "直接通过表达式赋值"
},
"search": String,
"phone": {
"type": "MobilePhone"
},
"receiveAddress": String,
"coupon": {
"type": String,
set(value) {
return { "$gt": new Date() }
}
},
"integral": {
"lala": {
"type": Number,
},
"kaka": {
"type": Number,
"in": [1, 2, 3],
}
},
"email": {
"type": 'Email',
},
},
{
filter({ search, email, integral }) {
return {
"email": email,
"integral": integral,
"test": {
a: 1,
b: undefined,
c: "",
d: null,
e: NaN,
e: 0,
},
}
}
}
)
新增Function类型验证
将handle函数名改为set
升级filter-null,取消递归执行嵌套函数
3.0.1
新增 Function 类型验证
将 handle 函数名改为 set
升级 filter-null,取消递归自动执行嵌套函数
FAQs
JS数据验证、转换递归器
The npm package check-data receives a total of 2 weekly downloads. As such, check-data popularity was classified as not popular.
We found that check-data demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.