Answers
不正确的数据必须挡在第一道大门之外 。
首先不能假定 处理失败(抛出异常) == 数据有错误 。这两点肯定没有必然的联系。总会有数据业务逻辑上必须,但不填却不会引发程序的致命错误。
当然也可以说把数据的校验,跟随着事务处理的过程逐步进行。但这会导致两个问题:
- 时间的拖延,不能立刻得到数据合法与否的反馈结果;用户总是会用各种想不到的办法试验API,他们希望犯错时得到立刻的反馈,而不是等服务器处理半天失败了才知道。
- 执行了一半的事务还要特意丢弃,浪费服务器处理资源,绝对不如对非法数据干脆就不开启事务。
请坚持得到用户数据输入时第一时间进行校验 。对于RESTful风格API而言,你可以考虑返回对应的HTTP错误状态码以及JSON格式的错误信息正文,帮助用户得到正确的反馈。
题外话。
对于API接口还差一点儿。但对网页表单接口来说,在这个目的上 Node.js 就会体现出绝大的优势:对于Node.js程序来说,前端和后端的数据校验代码是 直接复用 的!
如果对于一般的PHP后端来说,可能就要想点办法了。我建议可以自己规定一套统一的JSON格式校验表,定义哪些数据字段需要哪些约束条件(required、email、number等),然后前后段查同一张校验表,去写通用的代码做校验。
比较忌讳的是同一个目的的校验代码,手工用原生的JS和PHP写两份——维护两份同样目的代码的同步,做过就知道会死人了!