javascript - „Nu se poate citi proprietatea message din null” atunci când se citește codul de stare al erorii din răspunsul http în Angular 8


Dezvolt în Angular 8 și trimit o cerere HTTP POST către un API web .NET Core și returnez un cod de stare 400 dacă numele de utilizator sau parola sunt incorecte. Consola Chrome afișează că s-a returnat 400, dar atunci când extrag codul de stare din observable-ul returnat de răspunsul la cererea HTTP, primesc un mesaj de eroare Cannot read property message of null. Cum pot remedia asta? Mulțumesc.

Componentă de autentificare:

this.authService.login(
      {
        username: this.f.username.value,
        password: this.f.password.value
      }
    )
    .subscribe(
        res => {
          if(this.returnUrl != null){
            this.router.navigate([this.returnUrl]);
          }
          else {
            let role = res.role[0];
            this.router.navigate([`${role}`]);
          }

        },
        error => {
            //This line throws the error. the value of error is "cannot read message property of null" and error.status = undefined.
            alert(error.status);
            this.badCredentials = true;
            this.router.navigate(['/login']);
        });

Serviciu de autentificare:

login(user: {username: string, password: string}) :Observable<any>{
    return this.http.post<any>(`${applicationPaths.loginApiUrl}`, user)
    .pipe(
      tap(response => this.doLoginUser(response)),
      catchError((error): any => {

              return throwError(`Connection Error: ${error}`);
          }
      ));
  }

ACTUALIZARE:

Am actualizat codul în aplicația mea Angular la următorul și tot afișează aceeași eroare: Serverul a returnat codul: undefined, mesajul de eroare este: Nu se poate citi proprietatea 'message' a obiectului null

login(user: {username: string, password: string}) :Observable<any>{
    return this.http.post<any>(`${applicationPaths.loginApiUrl}`, user)
    .pipe(
      tap(response => this.doLoginUser(response)),
      catchError(this.handleError));
  }

  handleError(err: HttpErrorResponse) {
    let errorMessage = '';
    if(err.error instanceof ErrorEvent){

      //a client-side or network error occured. Handle it accordingly.
      errorMessage = `An error occured: ${err.error.message}`;

    } else {
      //The back-end returned an unsuccessful response code.
      errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
    }

    console.error(errorMessage);
    return throwError(errorMessage);
  }

Dar când fac return BadRequest("username sau parola incorectă."); sau return BadRequest();, returnează mesajul de eroare Server returned code: undefined, error message is: undefined. Deci poate că asta are legătură cu modul în care returnez codul de eroare din API-ul web în back-end. Nu sunt sigur ce trebuie corectat acolo.

Răspuns #1

starea este oferită doar dacă observe: 'response'

încearcă să editezi authService-ul tău așa

login(user: {username: string, password: string}) :Observable<any>{
    return this.http.post<any>(`${applicationPaths.loginApiUrl}`, user
      // NEW CODE HERE
      { observe: 'response' }
    )
    .pipe(
      tap(response => this.doLoginUser(response)),
      catchError((error): any => {

              return throwError(`Connection Error: ${error}`);
          }
      ));
  }

Răspunsul #2

Adaugă { observe: 'response' } în codul tău astfel

login(user: {username: string, password: string}) :Observable<any>{
    return this.http.post<any>(`${applicationPaths.loginApiUrl}`, user, { observe: 'response' })
    .pipe(
      tap(response => this.doLoginUser(response)),
      catchError((error): any => {
              return throwError(`Connection Error: ${error}`);
          }
      ));
  }

Apoi încearcă să accesezi datele despre eroare în catchError astfel

error.statusText
error.statusCode

Editați, ar trebui să folosiți acest cod în controlerul dumneavoastră

 return BadRequest();

Codul tău

return StatusCode(400);

returnează doar codul de stare