Serverpod客户端如何获取邮箱认证失败的具体原因?
在Serverpod中为createAccountRequest返回有意义的错误提示
要解决创建账号失败时无法区分错误类型的问题,核心思路是让服务端返回具体的错误类型而非仅布尔值,客户端根据错误类型展示对应提示。以下是具体实现方案:
1. 定义错误枚举(服务端)
先创建一个枚举类,覆盖所有可能的账号创建失败场景:
enum AccountCreationError { emailExists, // 邮箱已注册 connectionFailed, // 数据库/网络连接失败 invalidInput, // 输入格式无效(如邮箱格式错误) unknownError // 未知错误 }
2. 修改服务端方法的返回类型
将原返回bool改为返回包含成功/错误信息的结果对象,推荐使用Serverpod内置的Result类型:
import 'package:serverpod/serverpod.dart'; Future<Result<User, AccountCreationError>> createAccountRequest(Session session, SignUpData signUpData) async { // 检查邮箱是否已存在 final existingUser = await User.findSingleRow( session, where: (user) => user.email.equals(signUpData.email) ); if (existingUser != null) { return Result.error(AccountCreationError.emailExists); } // 校验输入格式 if (!isValidEmail(signUpData.email) || signUpData.password.length < 6) { return Result.error(AccountCreationError.invalidInput); } try { // 执行账号创建逻辑 final hashedPassword = await PasswordHash.hash(signUpData.password); final newUser = User( email: signUpData.email, passwordHash: hashedPassword ); await User.insert(session, newUser); return Result.success(newUser); } catch (e) { // 判断连接类异常 if (e is DatabaseConnectionException) { return Result.error(AccountCreationError.connectionFailed); } // 其他未知异常 return Result.error(AccountCreationError.unknownError); } }
3. 客户端处理错误并展示提示
调用服务端方法后,根据返回的错误类型生成对应提示文案,再通过弹窗或SnackBar展示:
final result = await client.auth.createAccountRequest(signUpData); result.when( success: (user) { // 账号创建成功逻辑,如跳转首页 Navigator.pushReplacementNamed(context, '/home'); }, error: (errorType) { String tipMessage; switch (errorType) { case AccountCreationError.emailExists: tipMessage = "该邮箱已被注册,请更换邮箱重试"; break; case AccountCreationError.connectionFailed: tipMessage = "网络连接失败,请检查网络后重试"; break; case AccountCreationError.invalidInput: tipMessage = "输入格式错误,请检查邮箱格式或密码长度"; break; default: tipMessage = "账号创建失败,请稍后再试"; } // 展示提示(示例用SnackBar) ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(tipMessage)) ); } );
备选方案:自定义SessionException
如果偏好抛出异常的方式,可以自定义继承SessionException的异常类:
// 服务端自定义异常 class EmailExistsException extends SessionException { EmailExistsException() : super("邮箱已注册", code: "email_exists"); } // 服务端方法中抛出 if (existingUser != null) { throw EmailExistsException(); } // 客户端捕获并处理 try { await client.auth.createAccountRequest(signUpData); // 成功逻辑 } on SessionException catch (e) { String tipMessage; switch (e.code) { case "email_exists": tipMessage = "该邮箱已被注册"; break; // 其他错误码对应提示 default: tipMessage = "创建失败,请重试"; } // 展示提示 }
内容的提问来源于stack exchange,提问作者Mahmoud Alawady
相关产品推荐
相关产品推荐

