You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:07:07