ค้นหาเว็บไซต์

typescript - วิธีระบุข้อผิดพลาดหลายรายการใน JavaScript promises?


ฉันกำลังพยายามใช้พรอมิสส์เป็นครั้งแรก แต่ฉันกำลังมีปัญหาในการหาวิธีที่ดีที่สุดในการจัดการข้อผิดพลาด/ข้อยกเว้นหลายประเภท

ฉันกำลังดำเนินการสร้างระบบเข้าสู่ระบบผู้ใช้ ซึ่งการทราบว่าการเข้าสู่ระบบล้มเหลวเพราะชื่อผู้ใช้ไม่มีอยู่ รหัสผ่านไม่ถูกต้อง หรือเกิดข้อผิดพลาดอื่น ๆ จะเป็นประโยชน์

ด้านล่างเป็นส่วนหนึ่งของบริการล็อกอินของฉันซึ่งใช้ AWS Cognito (ส่วนใหญ่ไม่เกี่ยวข้องที่นี่) ใน callback ของ onFailure ฉันได้เลือกสร้างข้อยกเว้นของตัวเอง เนื่องจากคลาส CognitoAuth ของฉันใช้อินเทอร์เฟซ Auth ฉันจึงไม่ต้องการส่งรหัสข้อผิดพลาดของ AWS ไปยังลูกค้า (เพื่อแยกความรับผิดชอบออกจากกัน ดังนั้นจึงเป็นข้อยกเว้นของตัวเองซึ่งสามารถใช้โดยผู้ให้บริการอื่นได้)

  public login(loginData: IAuthLoginData): Promise<void> {
    let authenticationDetails = new AuthenticationDetails({
      Username: loginData.email,
      Password: loginData.password
    })

    let cognitoUser = new CognitoUser({
      Username: loginData.email,
      Pool: this.userPool
    })

    return new Promise<void>((resolve, reject) => {
      cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (session: CognitoUserSession, userTrackingConfirmationNecessary: boolean) => {
          resolve()
        },
        onFailure: (err) => {
          switch (err.code) {
            case 'UserNotFoundException':
              reject(new UserNotFoundError())

            case 'UserNotConfirmedException':
              reject(new UserNotConfirmedError())

            case 'NotAuthorizedException':
              reject(new PasswordIncorrectError())

            default:
              reject(new LoginError())
          }
        }
      })
    })
  }

ปัญหาแรกที่ฉันเจอคือความไม่น่าดูของข้อยกเว้นใน TypeScript โดยเฉพาะเมื่อสร้างหลายข้อ:

export class UserNotFoundError extends Error {
  constructor(message?: string) {
    super(message);

    // restore prototype chain
    const actualProto = new.target.prototype;
    if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); }
    else { this.__proto__ = new.target.prototype; }
  }
}

ด้านล่างนี้คือวิธีที่ฉันจัดการกับพรอมิสและข้อยกเว้นในลูกค้า ฉันสามารถระบุสาเหตุของความผิดพลาดได้ แต่การใช้การตรวจสอบ instance ของข้อยกเว้นดูเหมือนจะแปลกเล็กน้อยและทำให้ฉันสงสัยในประโยชน์ของมันที่นี่

  private login() {
    this.auth.login({
      email: this.email.value,
      password: this.password.value
    })
    .then(() => {
      this.navCtrl.setRoot(HomePage);
    })
    .catch((err: Error) => {
      if (err instanceof UserNotFoundError)
        this.email.setErrors({
          usernotfound: true
        })
      else if (err instanceof UserNotConfirmedError)
        this.form.setErrors({
          usernotconfirmed: true
        })
      else if (err instanceof PasswordIncorrectError)
        this.password.setErrors({
          passwordincorrect: true
        })
      else
        this.form.setErrors({
          ooops: true
        })
    })
  }

ฉันควรระบุข้อผิดพลาดที่เกิดขึ้นในเมธอด catch อย่างถูกต้องได้อย่างไร? ฉันควรหลีกเลี่ยงข้อยกเว้นให้มากที่สุดใน TypeScript หรือไม่? ฉันคิดว่า enum จะดีกว่า แต่จริงๆ แล้วฉันกำลังสร้างระบบข้อผิดพลาดของตัวเองขึ้นมาใหม่ ไลบรารี/เฟรมเวิร์กจัดการเรื่องนี้อย่างไร?

โดยอุดมคติแล้วฉันต้องการความปลอดภัยของชนิดข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้ และฉันไม่ค่อยอยาก โยน หรือ ปฏิเสธ สตริงเพราะว่านั่นไม่ได้ช่วยอะไรลูกค้าเท่าไหร่