Egg.js 如何优雅的校验参数?
发布于 7 年前 作者 tczhangzhi 12612 次预览 最后一次回复是 6 年前 来自 问答
在开发过程中我们很容易在控制器内写出下面的代码:
// 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 = {
...
}
...
我们应当如何解耦呢,或者有无合适的轮子? 我尝试过使用装饰器,将参数校验内容注入方法,让校验与方法体更近,但是仍然有些朋克风。
23 回复
这是个好问题,我的思路是:
伪代码如下
不知道社区有没有更好的做法。
@215566435 TS 的话应该就这样了,不一定要作为方法装饰器,也可以是参数装饰器。
JS 的话,把这些规则放到 app/validate 下,然后写个 loader 自动挂载到 app.validateRule.xx 即可
https://github.com/MiYogurt/egg-y-validator
@atian25 棒
@MiYogurt 赞。
我之前有看过 https://github.com/ianstormtaylor/superstruct 也不错
@atian25 恩,有时间我看看,写个一个这个版本的。
@MiYogurt 其实可以写一个通用的,类似 egg-view
@atian25 恩,通过 config 来配置使用哪种方式。
@chenyehong 看置顶公告帖
觉得还好吧,并不觉得很污染
@AnzerWall rule 要 cache 下吧
@AnzerWall Hey,有兴趣来我厂搞基试试看吗?
@xadillax emmm,死月现在不在大搜车了吧?
@AnzerWall 欢迎找我内推给死月
@atian25 别跟我抢 233333
@xadillax 没抢啊,我推给你啊
joi欢迎你 这才是优雅
@MiYogurt @atian25 刚才用了一下 superstruct ,发现好像没有类型转换的方法,number类型的经过http传输就变成字符串了,所以这个只能在前端用吗?
@ycvcb123 这是 HTTP 本身的规范,跟什么校验库没啥关系。query 肯定是 String 的,如果你要 number 的通过 body 来