数据验证

数据验证的位置

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

相关库

  • 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;
};
相关推荐
疯狂打码的少年2 小时前
【数据库技术】复习日:关系代数 + SQL + 规范化(整理对比表)
jvm·数据库·笔记·sql
Neighbor_OldY2 小时前
【实战复盘】文件上传漏洞检测与应急处置:校验绕过、图片马与WebShell的排查修复指南
运维·前端·web安全
金花顺2 小时前
android_media_AudioTrack_setup
前端
晓天衡宇•评测社区2 小时前
Seedance 2.5 登顶图生视频榜单,Wan 3.0 在游戏与教育场景进入前列
前端·javascript·网络
码海无涯回头无岸2 小时前
Ai agent - LLM是一个函数
前端
先吃饱再说2 小时前
从零开发到工程查询:SQLite 嵌入式数据库与高级 SQL 实战
数据库
Profile排查笔记2 小时前
指纹浏览器推荐:用一套验收清单筛选 Profile、代理与自动化能力
前端·人工智能·后端·自动化
卡皮巴拉c992 小时前
基于pnpm搭建monorepo项目
前端·javascript
ShineWinsu2 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
yume_sibai2 小时前
CSS2 核心知识点完全总结(选择器 + 三大特性 + 常用属性)
前端·css