bigo-frontend / blog

👨🏻‍💻👩🏻‍💻 bigo前端技术博客
https://juejin.cn/user/4450420286057022/posts
MIT License
129 stars 9 forks source link

【node实战系列】入参校验validate #70

Open yeyeye0525 opened 3 years ago

yeyeye0525 commented 3 years ago

file

本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注、转载。

背景

bigo前端开始推广bff,hello农场作为首个bff落地项目,历经2个月,完成了从0-1的落地实践。

【node实战系列】按照小模块拆分,从开发者的角度讲叙,如何进行bff高可用编码。

本系列文章,基于eggjs框架编码,使用ts语法,为了提升阅读体验,建议大家先了解一下eggjs。

系列文章

欢迎大家关注我们的github blog,持续更新。 https://github.com/bigo-frontend/blog/issues

入参校验validate

前言

笔者以前复盘过一个线上事故,前端提交数据,bff透传,中台业务消费,发现任何一方都以为调用方做了入参校验,导致最终入库时异常了。

image

这种情况在日常开发过程中都挺常见的。

我们作为bff聚合层,有责任进行入参校验的。

校验规则

校验规则,其实egg框架已经集成了校验规则,使用起来也特别简单。

封装通用校验方法

/**
 * 是否入参校验异常
 *
 * @param {*} rule 校验规则
 * @param {*} obj 校验对象
 * @returns
 */
validateErr(rule, obj: PlainObject): boolean {
  try {
    this.validate(rule, obj);
    return false;
  } catch (err) {
    this.logError('入参校验异常=%j', err);
    this.fail({
      message: err,
    });
    return true;
  }
},

单条件入参校验

const rule = {
  account: { type: 'object' },
  initDecoration: { type: 'string', required: false },
  initMood: { type: 'number', default: 100, required: false },
};

if (ctx.validateErr(rule, {
  account: {"accountName":"bigo大魔王", "gender":"F"},
  initDecoration: '2333,yysd'
})) {
  return;
}

多条件入参校验

const rule = {
  account: { type: 'object' },
  initDecoration: { type: 'string', required: false },
  initMood: { type: 'number', default: 100, required: false },
};

const ruleAccount = {
  showGlory: { type: 'enum', values: [0, 1], required: true},
  showAppearance: { type: 'enum', values: [0, 1], required: true},
  interestTags: { type: 'string', required: false },
};

if (ctx.validateErr(rule, {
  account: {"accountName":"bigo大魔王", "gender":"F"},
  initDecoration: '2333,yysd'
})) {
  return;
}

if (ctx.validateErr(ruleAccount, {
  showGlory: 0,
  showAppearance: 1,
})) {
  return;
}

总结

在日常的开发中,经常需要对方法参数进行校验(非空、长度等)。如果采用hardcode去校验(if..else..),会造成代码冗余,复用性低,导致维护成本比较高。借助validate组件,可以很方便地通过规则来校验参数。

欢迎大家留言讨论,祝工作顺利、生活愉快!

我是bigo前端,下期见。