数据验证

数据验证的位置

  • 前端(客户端)为了用户体验
  • 路由层:验证接口格式是否正常
  • 业务逻辑层:保证业务完整性
  • 数据库验证:保证数据完整性

相关库

  • validator:用于验证某个字符串是否满足某个规则
  • validator.js:用于验证某个对象的树形是否满足某些规则

常用验证函数

  1. 验证电子邮件地址

    js 复制代码
    const email = 'test@example.com';
    console.log(validator.isEmail(email)); // true
  2. 验证URL

    js 复制代码
    const url = 'https://example.com';
    console.log(validator.isURL(url)); // true
  3. 验证IP地址

    js 复制代码
    const ip = '192.168.1.1';
    console.log(validator.isIP(ip)); // true
  4. 验证手机号码

    js 复制代码
    const phone = '13800138000';
    console.log(validator.isMobilePhone(phone, 'zh-CN')); // true
  5. 验证字符串是否为数字

    js 复制代码
    const num = '123';
    console.log(validator.isNumeric(num)); // true
  6. 验证字符串是否为日期

    js 复制代码
    const date = '2023-10-01';
    console.log(validator.isDate(date)); // true
  7. 验证字符串是否为JSON

    js 复制代码
    const json = '{"name": "John"}';
    console.log(validator.isJSON(json)); // true

常用净化函数

  1. 去除字符串两端的空白字符

    js 复制代码
    const str = '  hello  ';
    console.log(validator.trim(str)); // 'hello'
  2. 转义HTML

    js 复制代码
    const html = '<script>alert("xss")</script>';
    console.log(validator.escape(html)); // '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'
  3. 去除非法字符

    js 复制代码
    const str = 'Hello <world>!';
    console.log(validator.stripLow(str)); // 'Hello !'

自定义验证

validator.js 还允许你自定义验证规则。例如,你可以使用 matches 函数来验证字符串是否符合特定的正则表达式:

js 复制代码
const str = 'abc123';
console.log(validator.matches(str, /^[a-z0-9]+$/)); // true

链式调用

validator.js 支持链式调用,可以一次性进行多个验证:

js 复制代码
const email = 'test@example.com';
const result = validator.isEmail(email) && validator.isLength(email, { min: 5, max: 30 });
console.log(result); // true

完整示例

必须验证的属性加上:presence:true

不允许以下格式存在(验证不通过):allowEmpty:false

  • {}
  • ""
  • " "
js 复制代码
exports.addStudent =async function (stuObj){
  //挑选属性
  stuObj=pink(stuObj,"name","birthday","sec","mobile","ClassId");
   //自定义规则
   validata.validators.classExits = async function(value){
    const c =await Class.findByPk(value)
    if(c){
      return;
    }
    return "班级不存在";
   }
  const rule ={
    //验证规则
    name:{
      presence:{
        allowEmpty:false
      },
      type:"string",
      length:{
        minimum:2,
        maximum:10
      }
    },
    birthday:{
      presence:{
        allowEmpty:false
      },
      datetime:{
        dateOnly:true,
        earliest:moment.utc().subtract(100,"y"),
        latest:+momnet.utc().subtract(5,"y")
      },
    },
    sec:{
      presence:{
        allowEmpty:false
      },
    },
    mobile:{
      presence:{
        allowEmpty:false
      },
      format:{
        pattern:/^1\d{10}/
      }
    },
    ClassId:{
      presence:true,
      // //严格
      // type:"integer",
      //不严格
      numericality:{
        onlyInteger:true,
        strict:false,
      },
      classExits:true
   }
  };
  await validate.async(stuObj,rule);
   const ins = await Student.create(stuObj);
   return ins.toJSON();
} 
js 复制代码
const validate = require("validate.js");
const moment = require("moment");
validate.extend(validate.validators.datetime, {
    /**
    * 该函数会自动用于日期格式转换
    * 它会在验证时自动触发,它需要将任何数据转换为时间戳返回
    * 如果无法转换,返回NaN
    * @param {*} value 传入要转换的值
    * @param {*} options 针对某个属性的验证配置
    */
    parse(value, options) {
      let formats = ["YYYY-MM-DD HH:mm:ss", "YYYY-M-D H:m:s", "x"];
      if (options.dateOnly) {
         formats = ["YYYY-MM-DD", "YYYY-M-D", "x"];
      }
      return +moment.utc(value, formats, true);
    },
    /**
    * 用户显示错误消息时,使用的显示字符串
    */
    format(value, options) {
       let format = "YYYY-MM-DD";
       if (!options.dateOnly) {
          format += " HH:mm:ss";
        }
       return moment.utc(value).format(format);
  },
}

对象属性处理

js 复制代码
exports.pick = function (obj, ...props) {
    if (!obj || typeof obj !== "object") {
        return obj;
    }
    const newObj = {};
    for (const key in obj) {
        if (props.includes(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
};
相关推荐
洋不写bug19 小时前
数据库的约束和主键
数据库
你想考研啊19 小时前
sqlserver新建用户和表
数据库
小二·19 小时前
Python Web 开发进阶实战:AI 原生硬件接口 —— 在 Flask + MicroPython 中构建边缘智能设备控制平台
前端·人工智能·python
李慕婉学姐19 小时前
【开题答辩过程】以《基于uniapp的养宠互助服务程序设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
android·mysql·uni-app
码农水水19 小时前
京东Java面试被问:分布式会话的一致性和容灾方案
java·开发语言·数据库·分布式·mysql·面试·职场和发展
ElasticPDF-新国产PDF编辑器19 小时前
基于 PDF.js 的 PDF 文字编辑解决方案,纯前端 SDK,跨平台、框架无关、Web 原生
前端·javascript·pdf
带带弟弟学爬虫__19 小时前
速通新Baidu Frida检测
前端·javascript·vue.js·python·网络爬虫
雪碧聊技术19 小时前
DBeaver连接sql server数据库时,提示驱动版本不合适
数据库·sqlserver·dbeaver·更换驱动·修改java.security
Tansmjs19 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
是三好19 小时前
redis
数据库·redis·缓存