ExpressJS文章创建接口:选输入校验还是MySQL错误处理?
问题:字段完整性校验还是依赖MySQL错误抛错?
现有表结构
CREATE TABLE IF NOT EXISTS article ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, title VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, content TEXT(8191) NOT NULL, PRIMARY KEY (id) );
场景描述
在ExpressJS的createArticle控制器中,从req.body接收用户输入执行创建操作,输入可为全字段或仅title字段。当前代码包含输入字段缺失校验与MySQL执行逻辑,请问应选择基于输入字段完整性检查抛错还是基于MySQL错误抛错?该问题同样适用于更新操作。
回答
优先做应用层的输入完整性检查,而非依赖MySQL抛错,原因如下:
不依赖MySQL错误的核心原因
- 错误信息不友好:MySQL返回的原生错误(如
1048 - Column 'slug' cannot be null)是面向数据库运维的,直接返回给前端用户完全看不懂,还得额外做错误解析逻辑,徒增工作量。 - 浪费资源:每次都把无效请求打到数据库才发现参数缺失,会占用数据库连接资源,高并发场景下这种损耗会被放大。
- 耦合性高:如果后续表结构变更(比如把
slug改成允许空值),依赖MySQL错误的代码会直接失效,必须同步修改应用层逻辑,维护成本高。
应用层校验的优势
- 提前拦截无效请求:在请求到达数据库之前就拦住不合格输入,减少无意义的数据库交互。
- 自定义友好提示:可以返回业务化的清晰提示,比如
"请补充slug字段",直接提升用户体验。 - 逻辑解耦:业务校验规则集中在应用层,和数据库表结构变更解耦,后续调整规则更灵活。
特殊情况补充
如果是复杂唯一性约束(比如slug全局唯一),这种场景下必须依赖数据库唯一索引来保证一致性(避免并发写入的竞态问题),但基础的非空、字段格式类校验,还是要放在应用层提前处理。
内容的提问来源于stack exchange,提问作者Suleyman
相关产品推荐
相关产品推荐

