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

Value Object静态工厂实现UserPassword校验与哈希逻辑方案咨询

实现方案

你当前的核心问题是bcrypt.hash为异步方法,原本同步的静态工厂方法无法直接获取哈希结果,调整方案如下:

核心改动点

  • 将静态create方法改为异步返回,避免使用同步哈希方法阻塞服务端事件循环
  • 在校验阶段先完成非空规则校验,不合法直接抛出明确错误,保证所有创建成功的UserPassword实例一定符合业务规则
  • 移除不必要的私有hashPassword方法,直接在工厂方法内完成哈希逻辑,代码更简洁

完整实现代码

import * as bcrypt from 'bcrypt';

export class UserPassword {
  private readonly value: string;

  // 构造函数保持私有,仅允许通过静态工厂方法创建实例
  private constructor(value: string) {
    this.value = value;
  }

  public getValue(): string {
    return this.value;
  }

  // 异步静态工厂方法,完成校验+哈希逻辑
  public static async create(password: string): Promise<UserPassword> {
    // 非空校验,可根据业务需求扩展密码长度、复杂度等规则
    if (!password || password.trim().length === 0) {
      throw new Error('密码不能为空');
    }
    // 完成哈希处理
    const hashedPassword = await bcrypt.hash(password, 10);
    return new UserPassword(hashedPassword);
  }

  // 密码比对方法保持不变
  public async comparePassword(password: string): Promise<boolean> {
    return bcrypt.compare(password, this.value);
  }
}

使用示例

try {
  // 创建密码实例
  const userPassword = await UserPassword.create('your_test_password');
  // 获取哈希后的值
  console.log(userPassword.getValue());
  // 比对密码
  const isPasswordValid = await userPassword.comparePassword('your_test_password');
  console.log(isPasswordValid); // 输出true
} catch (err) {
  // 捕获校验错误
  console.log(err.message);
}

补充说明

如果你的场景必须使用同步逻辑,可以替换为bcrypt.hashSync方法,但高并发场景下同步哈希会阻塞Node.js事件循环,非常不推荐使用。所有校验逻辑都可以统一放在create方法中,完全保证值对象的不变性约束,符合DDD的设计规范。

内容的提问来源于stack exchange,提问作者dollars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:08