Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yeyeye0525 opened this issue Sep 10, 2021 · 0 comments
Open

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

yeyeye0525 opened this issue Sep 10, 2021 · 0 comments

Comments

@yeyeye0525
Copy link
Contributor

yeyeye0525 commented Sep 10, 2021

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前端,下期见。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant