zoukankan      html  css  js  c++  java
  • [nodejs] web后端开发时, 用hapi/Joi对前端提交的数据进行校验--随笔

    在nodejs安装@hapi/joi

    npm install @hapi/joi
    

    使用@hapi/joi

      const Joi = require('@hapi/joi');
      
      let schema = Joi.object({
        username : Joi.string().required().label("用户名"),
        password : Joi.string().required().label("密码"),
        remark : Joi.string().empty("").default("").label("备注"),
      });
    
      let data = {
        "username" : "11",
        "password" : "11",
      };
    
      let{error, value} = schema.validate(data);
      if (error) {
        throw new Error(error.details.shift().message)
      }
    

      

      以上被校验的数据data中, 少了remark字段也是可以通过, 因为在声明校验规则的时候, 对remark字段未使用required(), 则此时的remark字段由default()来指定, 而empty() 指定了remark被允许为空字符串.

    扩展

    但在开发过程中, 前端提交的数据中, 可能包含有不在校验规则中的字段, 则会一直报错, 如若需要前端去掉这些字段, 又需要很大的工作量。这个问题可以通过对校验函数的约束条件解决,分如下两步:

    第一步:允许规则之外的未知字段

    let{error, value} = schema.validate(data);
    /*把上面这一行代码,修改如下:*/
    let{error, value} = schema.validate(data, {allowUnknown:true});
    

      这样,就算data数据中包含不在校验规则之中的字段,只要data通过了规则的校验,就不会报错了。但这里会引发另外一个问题, 就是这些不在校验规则的字段也会出现在结果集value里,如若此接口就是把需要校验规则的字段数据插入数据里的话, 这些未知的字段并不存在数据库的表字段中, 肯定会影响输入的。

    第二步:删除未知的元素

    let{error, value} = schema.validate(data);
    /*把上面这一行代码,修改如下:*/
    let{error, value} = schema.validate(data, {allowUnknown:true, stripUnknown: true});
    

      这样,value中就只会包含存在于校验规则之中的字段。

    ----

    随笔随笔,随手记录开发中的知识点。

  • 相关阅读:
    【翻译】谈 focus 和 blur 的事件代理
    【翻译】细分域名的优势
    Form窗体的Combobox键值对绑定
    日志
    ajaxload
    c#文件整理程序
    每天工作4小时的程序员
    每年这一天
    转载从交友到社交的个人成长
    旅行的意义
  • 原文地址:https://www.cnblogs.com/dilex/p/13419844.html
Copyright © 2011-2022 走看看