egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决

前言

egg-validate是基于paramter的一个egg参数校验插件,这个插件使用方便,易于定制,但是它却有个隐形之坑:

''空字符串使用convertType自动转Number会变成0。


具体是怎么样的呢?

这是一个简单的添加用户表单:
对应的代码:
egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第1张图片
对应的validate

egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第2张图片

可以看到age使用的type是number,而number对应的convertType为Number,所以当validate时,会预先把它转成Number,然后再进行判断。这里config.default.js要开启convert: true。不然字符串类型直接就判断错误了。具体可以看文档。

但是这样还是有个隐形错误,是什么呢?

Number('') = 0!!!

这说明了,如果age不传,他也会被赋值为0

实际的表单填写:
egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第3张图片

这里用户名、密码、性别都是符合要求的,但是年龄age没有填,点击增加,发现系统根本没有报错,看一下数据库,age被赋值为0传进去了(这里是因为schema设置了age默认值为0)。

因为实际的request.body是这样子的:
egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第4张图片

age虽然没填,但是还是传了个''

''被Number转型就变成了0,从而神乎其技的跳过了检测。


解决办法

有两种,设置min大于0,这样不传值就会被检测小于0,从而无法通过认证:
egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第5张图片
在这里插入图片描述

当然这种方法太不优雅了

第二种办法:

添加一个自定义的规则:

 /**
  * 检测Number 类型
  */
  validator.addRule('Number', (rule, data)=>{
    console.log('data', data);
    if (data === '') {
      return 'can not be null';
    }

    data = Number(data);
    if (! Number.isNaN(data)) {
      return 'must be Number';
    }

    if (rule.min) {
      if (rule.min > data) {
        return 'must more than ' + rule.min;
      }
    }

    if (rule.max) {
      if (rule.max < data) {
        return 'must less than ' + rule.max;
      }
    }
  });

使用:
egg-validate(paramter) 隐形之坑''空字符串自动转Number会变成0,就这么解决_第6张图片
结果:
在这里插入图片描述

成功了!


实测type为自带的int也可以,但是不是判空:
在这里插入图片描述


有什么问题可以留言评论,看到会尽量回答

你可能感兴趣的:(js)