如何检查JSON API数据数组中是否存在指定注册邮箱项
问题原因
你写的逻辑存在两个致命问题,才会导致邮箱重复时仍然走注册流程:
- 循环判断逻辑位置错误:遍历用户列表时,只要当前遍历到的单个用户邮箱和输入的邮箱不一致,就会立刻触发
SaveUserData(),根本不会等所有用户遍历完。举个例子:如果注册用户列表里第1个邮箱不是你输入的重复邮箱,哪怕第2个就是重复的,代码也会先走到else分支直接保存用户数据。 - 缺少边界处理:没有判断接口请求是否成功、没有对用户输入的内容做去空格处理,很容易因为接口报错、输入带隐形空格出现匹配失效、程序崩溃的问题。
修复方案
调整遍历逻辑:先遍历完所有用户数据,用标记位记录邮箱是否存在,遍历结束后再统一判断走哪个分支,不要在循环内部直接执行业务跳转。
修复后的代码如下:
CheckEmail() async { // 拉取用户列表数据 var response = await http.get(Uri.parse("http://0.0.0.0:8080/index.php/path=users/")); // 先校验接口请求状态 if (response.statusCode != 200) { EasyLoading.showError("网络请求异常,请稍后重试"); return; } var data = jsonDecode(response.body) as List; bool emailExists = false; // 去除输入内容前后的隐形空格,避免空格导致匹配失败 String inputEmail = _emailController.text.trim(); // 遍历过程只做存在性标记,不执行业务分支 for (var a in data) { var email = a["email"]?.toString() ?? ""; if (email == inputEmail) { emailExists = true; break; // 找到匹配项直接终止循环,减少不必要的性能消耗 } } // 遍历全部完成后再统一判断走对应流程 if (emailExists) { EasyLoading.showError("该邮箱已存在,请更换其他邮箱注册"); } else { SaveUserData(); } }
额外优化建议
- 不建议前端拉取全量用户列表做邮箱校验,用户量较大时接口返回数据体积会非常大,性能损耗严重。最好让后端单独提供邮箱查重接口,前端把用户输入的邮箱作为参数传入,后端直接返回是否存在的布尔结果即可,既安全又高效。
- 发起查重请求前可以先做邮箱格式合法性校验,用正则判断输入内容是否符合邮箱格式,减少无效请求。
内容的提问来源于stack exchange,提问作者abdifatah nour
相关产品推荐
相关产品推荐

