首页 > 解决方案 > JavaScript:保存实体,能不能写得更好?

问题描述

我有一个保存在用户数据库中的方法。因为我的数据库有关系,所以我需要 userAuth 和 userSalary 表中 UserEntity 的 user_id ,所以user变量必须是第一个。但我想返回整个用户模型和关系作为响应。

你能把这个方法写得更优雅吗?例如 Promise.all 或 ES6+ 中的任何功能?

async createUser(userRegisterDto: UserRegisterDto): Promise<UserEntity> {
    const user = this.userRepository.create({ ...userRegisterDto });
    await this.userRepository.save(user);

    const userAuth = this.userAuthRepository.create({
        ...userRegisterDto,
        user,
    });
    await this.userAuthRepository.save(userAuth);

    const userSalary = this.userSalaryRepository.create({
        ...userRegisterDto,
        user,
    });
    await this.userSalaryRepository.save(userSalary);

    return user;
}

标签: javascripttypescriptecmascript-6

解决方案


第 5-8 行与第 10-13 行几乎相同,因此您可以将它们分解为单独的函数:

async function saveUserToRepo(repo, userRegisterDto: UserRegisterDto, user) : Promise {
    const newItem = repo.create({
        ...userRegisterDto,
        user,
    });
    await repo.save(newItem );
}

async createUser(userRegisterDto: UserRegisterDto): Promise<UserEntity> {
    const user = this.userRepository.create({ ...userRegisterDto });
    await this.userRepository.save(user);

    await saveUserToRepo(this.userAuthRepository, userRegisterDto, user);
    await saveUserToRepo(this.userSalaryRepository, userRegisterDto, user);

    return user;
}

如果可以并行运行这两个中间保存而不会导致任何问题(您需要对此做出判断),您可以使用Promise.all并行跟踪它们:

async createUser(userRegisterDto: UserRegisterDto): Promise<UserEntity> {
    const user = this.userRepository.create({ ...userRegisterDto });
    await this.userRepository.save(user);

    await Promise.all([
        saveUserToRepo(this.userAuthRepository, userRegisterDto, user),
        saveUserToRepo(this.userSalaryRepository, userRegisterDto, user),
    ]);    

    return user;
}

推荐阅读