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
相关产品推荐
相关产品推荐

