查还能抽几次的接口,活动没开始就报错
问题
抽奖活动页面一打开,前端就得先知道”这个用户还能抽几次""活动进行中没有”,用来决定按钮是亮着还是灰着。所以我做了一个只读查询接口,专门给前端进页面时用,就返回这些状态。
一开始我图省事,让这个接口直接复用活动校验那段逻辑——反正都是围绕同一个活动嘛。
现象
页面打不开了。
我自己推测了下:活动校验那段逻辑,遇到活动还没开始、或者已经结束的情况,是直接抛异常的。我的查询接口复用了它,于是活动没开始 / 已结束时,这个接口也跟着抛异常。前端一进来就收到报错,整个页面白屏,用户连”活动还没开始”这几个字都看不到。
可问题是,这个接口本来就是”看看状态”用的。用户进页面时活动没开始,这才是正常情况之一,结果被我当成错误给崩了。
怎么解决
把”查询”和”真正抽奖”这两件事的门禁分开。
- 真正抽奖那个写接口,该校验的还是校验,活动没开始 / 已结束就拒绝,没问题;
- 查询接口是只读的,不门禁:活动没开始就返回”未开始”,已结束就返回”已结束”,进行中就返回”进行中 + 还能抽几次”。前端拿到状态自己决定按钮怎么显示,页面照常进得去。
所以我给返回值加了一个”能不能抽”的标记(只有进行中才是 true),前端靠它判断,而不是靠接口报不报错来判断。
另外顺手把这条查询路径上”顺手写库”的动作也去掉了——它只是读状态,本不该每次都往数据库插一条记录。
结论
只读查询接口和写操作的门禁语义要分开。查询的本意是”告诉我现在是什么情况”,活动未开始、已结束都是合法情况,不该当成错误抛掉。要让前端进得去页面、看得到状态,再去决定下一步,而不是一进来就崩。