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

前言

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

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


具体是怎么样的呢?

这是一个简单的添加用户表单:
对应的代码:

在这里插入图片描述
在这里插入图片描述

对应的validate

在这里插入图片描述
在这里插入图片描述

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

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

Number('') = 0!!!

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

实际的表单填写:

在这里插入图片描述
在这里插入图片描述

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

因为实际的request.body是这样子的:

在这里插入图片描述
在这里插入图片描述

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

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


解决办法

有两种,设置min大于0,这样不传值就会被检测小于0,从而无法通过认证:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

当然这种方法太不优雅了

第二种办法:

添加一个自定义的规则:

 /**
  * 检测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;
      }
    }
  });

使用:

在这里插入图片描述
在这里插入图片描述

结果:
在这里插入图片描述
在这里插入图片描述

成功了!


实测type为自带的int也可以,但是不是判空:

在这里插入图片描述
在这里插入图片描述


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

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2019年07月06日 10:47:45

评论区#

还没有评论哦,期待您的评论!

关闭特效