0

新しいHttpClientModuleを使用して、Angular 4.3サービスから.NET Core WebApiによって返されたエラーを処理しようとしています。角度4.3 HttpClient:キャッチwebapiエラーレスポンスボディ

次のように私は、httpリクエストを作ってるんだ:

postUser(model: IPostUser): Observable<IUser> { 
    return this.http.post<IUser>(this.originUrl + '/api/registry', model) 
     .catch((reason: any) => this.handleError(reason)); 
} 

handleError方法は次のとおりです。

private handleError(error: HttpErrorResponse | any): ErrorObservable { 
    // in a real world app, we might use a remote logging infrastructure 
    let errStatus: string; 
    let errMsg: string; 
    if (error instanceof HttpErrorResponse) { 
     try { 
      const body: any = error.error || error; 
      const err: string = body.message || JSON.stringify(body); 
      errStatus = `${error.status} - ${error.statusText || ''}`; 
      errMsg = `${err}`; 

      if (error.status === 0) { 
       errMsg = 'Si é verificato un errore. Si prega di riprovare più tardi.'; 
      } else if (error.status === HttpStatusCodes.UNAUTHORIZED || error.status === HttpStatusCodes.FORBIDDEN) { 
       errMsg = 'Non hai effettuato l\'accesso.'; 
      } 
     } catch (ex) { 
      errMsg = 'Si é verificato un errore. Si prega di riprovare più tardi.'; 
     } 
    } else { 
     errMsg = error.message ? error.message : error.toString(); 
    } 
    console.error(errStatus + ': ' + errMsg); 
    this.toastrService.error(errMsg, 'Errore'); 
    return Observable.throw(errMsg); 
} 

そしてWEBAPIコントローラのアクションは、以下のセキュリティチェックを行います

var user = await _userManager.FindByIdAsync(model.Id); 
if (user == null) 
    return NotFound("Utente non trovato."); 

if ((await _userManager.FindByNameAsync(model.UserName)) != null) 
    return BadRequest("Esite già un utente con questo Username."); 
else if ((await _userManager.FindByEmailAsync(model.Email)) != null) 
    return BadRequest("Esite già un utente con questa Email."); 
else if ((await _userManager.Users.SingleOrDefaultAsync(u => u.TaxCode == model.TaxCode)) != null) 
    return BadRequest("Esite già un utente con questo Codice Fiscale."); 

したがって、どのユーザーがサーバーに投稿しようとするかに応じて、サーバーはNotFound o r BadRequestは、メッセージを含むオブジェクトである本文で再配置します。

そのWEBAPIアクション原因に悪いの呼び出しこのエラー:

undefined: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

私はエラーレスポンスボディをキャッチするHttpInterceptorを使用することを試みた:

@Injectable() 
export class ErrorInterceptor implements HttpInterceptor { 

constructor(private router: Router) { } 

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 

    return next.handle(req).do((event: HttpEvent<any>) => { 
     if (event instanceof HttpResponse) { 
      // do stuff with response if you want 
     } 
    }).catch((error: any) => { 
     if (error instanceof HttpErrorResponse) { 
      let x = error; 
      if (error.status === HttpStatusCodes.BAD_REQUEST || error.status === HttpStatusCodes.NOT_FOUND) { 
       return Observable.throw(error); 
      } 
     } 
    }) 
} 

}

しかし、迎撃器でも、エラーはまだ同じですメソッドの直後にpost呼び出しAngularサービスでは、私のカスタムエラーオブジェクトではなく、上記のTypeError例外が呼び出されました。

サーバーからBadRequest/NotFoundエラー応答を取得し、エラー応答本体を正しく取得するにはどうすればよいですか?

ありがとうございました!

答えて

0

問題が見つかりました。私は401403エラー応答のためだけObservable.throw(..)を返す別のインターセプタを持っています。常に例外を返すようにすると、問題が解決されます。

関連する問題