全栈项目|小书架|服务器开发-Koa2 参数校验处理

为什么需要做参数校验

在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环。

例如像App的注册登录表单提交页面,就要做好多层的判断。如:用户名是否为空,用户密码是否为空,密码长度是否足够等等

那么有没有比较优雅的方式实现呢?

如何优雅实现

这里使用的是基于validator.js封装的Lin-Validator,源码是七月老师提供。

Lin-Validator拥有的功能:

  • 参数校验,header,query,path,body中的所有参数校验

参数校验

验证器声明:

const { LinValidator, Rule } = require('lin-mizar');
/**
 * 正整数 参数校验
 */
class PositiveIntegerValidator extends LinValidator {
    constructor() {
        // 使用 this 一定要使用 super
        super()
        // 数组,且关系,也就是数组中所有都满足才能通过
        this.id = [
            new Rule('isInt', '需要是正整数', {
                min: 1
            }),
        ]
    }
}

/**
 * 更新用户信息
 */
class UpdateInfoValidator extends LinValidator {
  constructor () {
    super();
    this.email = [
      new Rule('isOptional'),
      new Rule('isEmail', '电子邮箱不符合规范,请输入正确的邮箱')
    ];
    this.nickname = [
      new Rule('isOptional'),
      new Rule('isLength', '昵称长度必须在2~10之间', 2, 10)
    ]
  }
}
module.exports = {
  PositiveIntegerValidator,
  UpdateInfoValidator
};

自定义别名使用

// 获取书籍的喜欢状态
router.get('/like', new Auth().m, async ctx => {
	// 接口中传递的参数是`bkid`,为了复用 PositiveIntegerValidator 对 id 的校验
	// 这里使用了自定义别名 id: 'bkid' 来完成验证器的调用
    const v =await new PositiveIntegerValidator().validate(ctx, {
        id: 'bkid'
    })
    const like = await Like.userLikeIt(
        ctx.auth.uid, v.get('query.bkid'))
    ctx.body = like
})

详细使用

可通过npm安装使用lin-mizar

package.json中添加lin-mizar的初始化即可:

"dependencies": {
    "lin-mizar": "^0.2.1"
  }

在要使用校验器的文件引入

const { Rule, LinValidator, isNotEmpty } = require('lin-mizar');

详细使用参考:TaleLin/lin-cms-koa中的/app/validators/】,方便的话顺手点个star支持一波。


咨询请加微信:轻撩即可。
在这里插入图片描述

posted @ 2019-11-10 13:41  龙衣  阅读(1336)  评论(0编辑  收藏  举报