CNode

Egg.js 如何优雅的校验参数?

问答
Ttczhangzhi发布于8 年前最后回复7 年前23 回复12853 浏览0 收藏

在开发过程中我们很容易在控制器内写出下面的代码:

// app/controller/topics.js
const Controller = require('egg').Controller;

// 定义创建接口的请求参数规则
const createRule = {
  ...
};

class TopicController extends Controller {
  async create() {
     ...
  }
}
module.exports = TopicController;

在接口较少的时候尚能条理清晰。一旦接口多起来,接口逻辑就会被行数众多的参数校验掩盖。

const createRule = {
  ...
}
const selectRule = {
  ...
}
const destroyRule = {
  ...
}
const updateRule = {
  ...
}
...

我们应当如何解耦呢,或者有无合适的轮子? 我尝试过使用装饰器,将参数校验内容注入方法,让校验与方法体更近,但是仍然有些朋克风。

查看回复

回复 (19)

2
215566435#1·8 年前

这是个好问题,我的思路是:

  1. 使用TS
  2. json序列化到类
  3. 使用装饰器,重写属性的get/set方法,校验在get/set中做,然后把序列化好之后的body,注入到controller中,作为函数参数。

伪代码如下

class User{
     name:string;
     id:number;
}

class xxx extends controller{
 
 @checkBody(User)
 async index(body:User){
 .....
 }

}

不知道社区有没有更好的做法。

A
atian25#2·8 年前
引用 215566435这是个好问题,我的思路是: 1. 使用TS 2. json序列化到类 3. 使用装饰器,重写属性的get/set方法,校验在get/set中做,然后把序列化好之后的body,注入到contro...

@215566435 TS 的话应该就这样了,不一定要作为方法装饰器,也可以是参数装饰器。

JS 的话,把这些规则放到 app/validate 下,然后写个 loader 自动挂载到 app.validateRule.xx 即可

M
MiYogurt#6·8 年前
引用 atian25@MiYogurt 赞。 我之前有看过 https://github.com/ianstormtaylor/superstruct 也不错

@atian25 恩,有时间我看看,写个一个这个版本的。

A
atian25#7·8 年前
引用 MiYogurt@atian25 恩,有时间我看看,写个一个这个版本的。

@MiYogurt 其实可以写一个通用的,类似 egg-view

M
MiYogurt#8·8 年前

@atian25 恩,通过 config 来配置使用哪种方式。

A
atian25#9·8 年前

@chenyehong 看置顶公告帖

A
AnzerWall#10·8 年前

image.png

觉得还好吧,并不觉得很污染

A
atian25#11·8 年前
引用 AnzerWall觉得还好吧,并不觉得很污染

@AnzerWall rule 要 cache 下吧

X
XadillaX#12·8 年前

@AnzerWall Hey,有兴趣来我厂搞基试试看吗?

A
AnzerWall#13·8 年前
引用 XadillaX@AnzerWall Hey,有兴趣来我厂搞基试试看吗?

@xadillax emmm,死月现在不在大搜车了吧?

A
atian25#14·8 年前
引用 AnzerWall@xadillax emmm,死月现在不在大搜车了吧?

@AnzerWall 欢迎找我内推给死月

mmexport1521704231440.jpg

X
XadillaX#15·8 年前

@atian25 别跟我抢 233333

A
atian25#16·8 年前
引用 XadillaX@atian25 别跟我抢 233333

@xadillax 没抢啊,我推给你啊

P
phper-chen#17·8 年前

joi欢迎你 这才是优雅

Y
ycvcb123#18·7 年前

@MiYogurt @atian25 刚才用了一下 superstruct ,发现好像没有类型转换的方法,number类型的经过http传输就变成字符串了,所以这个只能在前端用吗?

A
atian25#19·7 年前
引用 ycvcb123@MiYogurt @atian25 刚才用了一下 superstruct ,发现好像没有类型转换的方法,number类型的经过http传输就变成字符串了,所以这个只能在前端用吗?

@ycvcb123 这是 HTTP 本身的规范,跟什么校验库没啥关系。query 肯定是 String 的,如果你要 number 的通过 body 来

参与回复
登录后即可参与回复。登录