有没有一处定义,前后端校验都自动完成的框架

2018-12-12 13:05:31 +08:00
 Mangosteen

我是一个浅尝辄止的开发人员。目前用过 PHP 的 Laravel,Python 的 Flask,JS 的 Express。但是开发中一直有一个痛点是对于数据的校验,定义数据库时要进行一次,后端收到数据时要进行一次,前端还要写校验。

Laravel 可以在后端写好数据定义生成数据库表,但是收到的请求还是要自己写校验,前端也免不了。

Express 使用 MongoDB 做数据库,所以模型定义在后端,省去了建库,新建数据时候也会自动校验,但是收到数据时的校验与前端校验依然免不了。

Flask 做过的都是自己人用,只做了后端校验和数据库定义,但是应该各处校验都免不了。

其实无论后端校验,前端校验,数据模型定义,大部分校验规则都是一致的,就想知道目前有没有什么框架可以实现一处定义,其他部分的校验都自动完成。

2300 次点击
所在节点    问与答
17 条回复
wly19960911
2018-12-12 13:08:37 +08:00
我先不说后端校验,前端校验的效果实现和后端根本不一样,比如说某个 input 的数据有问题,你显示错误,那么怎么兼容后端代码处理呢。产品让你实现效果和每个框架默认提供都不一样,前端我认为不好处理
feverzsj
2018-12-12 13:11:17 +08:00
全放在后端就可以了
wxsm
2018-12-12 13:11:54 +08:00
如果你想用表单异步提交的话,这是不科学的。
Mangosteen
2018-12-12 13:20:42 +08:00
@wly19960911 前端效果是和后端不同,但是对数据的格式要求基本上是一致的。所以想某一处定义完之后规则自动套用到前后端。
提供不同效果,但是不用同样规则写很多遍
Mangosteen
2018-12-12 13:21:35 +08:00
@feverzsj 是个好办法,但是许多时候前端校验就够了,没必要花费网络和后端资源。
Mangosteen
2018-12-12 13:22:02 +08:00
@wxsm 不是太明白不科学的点在哪里
airyland
2018-12-12 13:36:47 +08:00
可以实现,我们就是这么做的,分享一下思路,方式就是在约定规范的情况下项目代码自动生成,本质上是维护一套通用的代码模板和代码生成器:思路如下:固定后端框架,统一前端框架(Vue)和前端交互(出错提示等),流程上只需要配置每个 model 的字段定义。

对于后端:生成器会自动在 controller 里生成格式校验代码,在逻辑代码里校验有效性(唯一性、权限),这里主要目的是解决基本的 rest 接口、参数处理、多语言、鉴权、统计、无需手写的校验、自动生成字典和接口文档等等但是仍预留了相当大的可扩展空间可以用来增加接口,对自动生成的代码执行 hook。当然这里还要根据 model 配置的修改自动生成 migrate 执行代码。

对于后台:自动生成相应的 form, table, filter 代码(.vue),基本修改一下就可以用了。

对于前端:自动生成 js sdk 文件给前端引用(后台,web 端和小程序端有差异) ,自动生成文档,每个 model 带有相应的接口请求操作及校验接口,直接复制粘贴。
passerbytiny
2018-12-12 13:46:06 +08:00
纠正楼主的认识错误,前后端校验是不一样的,前端侧重与交互(重点是出错后怎么纠正),后端侧重于安全(重点是不能出错),另外后端有时还要考虑验证速度。

别说前后端不能公用规则,就是不同的前端,可能都无法公用规则。
wly19960911
2018-12-12 16:32:37 +08:00
@Mangosteen #4 如果你真的想公用规则,不如考虑下正则表达式,做个规则表,然后后端前端获取规则,之后开始跑遍历然后输出错误,后端相对简单,但是前端需要根据输出来判断错误,提供交互上的提示,这个才是统一校验规则的麻烦。

至于前面说的生成器我认为不靠谱,最大的原因是限制了代码。
jessynt
2018-12-12 16:38:03 +08:00
yii
airyland
2018-12-12 16:43:40 +08:00
@wly19960911 靠不靠谱不是感觉来决定的,能有质量地完成项目需求即是可靠。你也忽略了我提到的扩展性,生成器是替代了重复工作,并不是替换所有,每个项目都有需要自己写部分代码的需求。如果你指的是前端限制了代码,你大概理解错了。前端的自动化部分是让你不用手写校验,核心是调用约定函数获得错误信息,至于后面如何展现错误,这个完全是自定义的。
wly19960911
2018-12-12 17:20:35 +08:00
@airyland #11
扩展性为什么会有问题。通过获取到的规则列表来跑相应的包来输出错误,而生成代码对于业务具有侵入性,包作为扩展随时更新仓库包即可获得你想要的功能。重复的功能当然应该由封装处理而不是生成。

你需要的是一个能提供前端后端都可以校验 [你所设置的规则] 并输出约定规范的包,而不是一个入侵代码的生成工具,这种程度根本不是一个框架做的。
airyland
2018-12-12 17:30:28 +08:00
@wly19960911 我理解你的意思,但我们出发点不同,你的出发点是理想的工程化,而我的出发点是快速完成业务代码,实际上不少公司的内部业务也是类似这样的工具来处理。所以我实现的是业务工具而不是抽象框架。
Mangosteen
2018-12-12 18:30:16 +08:00
@airyland 感谢思路分享,我们现在用的技术框架和需求和你们也类似。可以问一下生成器是如何实现的吗?有没有推荐的开源项目可参考。
谢谢。
Mangosteen
2018-12-12 18:35:55 +08:00
@passerbytiny 我明白前后端校验不同(实现方式和存在的意义)。但是基本规则是一致的,比如密码最低六位这项规则,前端实时提示提供友好用户体验,后端校验为输入数据提供安全和质量保障。但是这些规则需要写多次(前端后端数据库),希望可以减少这样的重复劳动。
blanu
2018-12-12 18:58:01 +08:00
1. TypeScript + ts-io (or with JSON Schema)
2. Protobuf
ucaime
2018-12-12 19:32:56 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516849

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX