gpt4 book ai didi

javascript - 在这种情况下是否有更好的 RXJs Operator 可以使用?

转载 作者:行者123 更新时间:2023-12-04 08:08:00 26 4
gpt4 key购买 nike

我有一个服务方法,它执行以下操作:

  • 通过 ID
  • 从数据库中查找用户
  • 检查是否已找到用户
  • 使用 bcrypt 将存储在数据库中的密码与作为参数提供的密码进行比较
  • 如果密码不正确,则抛出 UnauthorizedException,如果正确则返回用户。

  • 我只是想知道是否有更好的方法来使用 RxJS 运算符来做到这一点,因为我不喜欢从 bcrypt.compare 管道:
    public validateUser(email: string, pass: string): Promise<UserDto> {
    return this.userService
    .findOne({ email })
    .pipe(
    map((user: UserDto) => {
    if (!user || !user.password) {
    return throwError(new UnauthorizedException());
    }
    return user;
    }),
    switchMap((user: UserDto) => {
    return from(
    bcrypt.compare(pass, user.password) as Promise<boolean>
    ).pipe(
    map((passwordIsCorrect) => ({
    passwordIsCorrect,
    user
    }))
    );
    }),
    switchMap((res) => {
    if (!res.passwordIsCorrect) {
    return throwError(new UnauthorizedException());
    }
    return of(res.user);
    })
    )
    .toPromise();
    }

    最佳答案

    我不认为有更好的运算符可以使用,但是您可以将代码简化为全部在同一个 switchMap 中。像这样:

      public validateUser(email: string, pass: string): Promise<UserDto> {
    return this.userService.findOne({ email }).pipe(
    switchMap(user => {
    if (!user?.password) {
    return throwError(new UnauthorizedException());
    }

    return from(bcrypt.compare(pass, user.password)).pipe(
    switchMap(passwordIsCorrect => passwordIsCorrect ? of(user) : throwError(new UnauthorizedException()))
    )
    })
    ).toPromise();
    }
    但是,在这种情况下,您似乎正在努力使用 observable(将 promise 转换为可观察的,只是为了转换回 promise )。
    即使 userSerivce 返回 observable,为什么不直接将其转换为 promise?看起来代码会简单得多:
      public async validateUser(email: string, pass: string): Promise<UserDto> {
    const user = await this.userService.findOne({ email }).toPromise();

    if (!user?.password || !await bcrypt.compare(pass, user.password)) {
    throw new UnauthorizedException();
    }

    return user;
    }

    关于javascript - 在这种情况下是否有更好的 RXJs Operator 可以使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66126730/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com