Создание пользовательских ошибок, скрытых в ответе сервера в Angular - PullRequest
0 голосов
/ 07 октября 2019

Я пишу приложение Angular8, где сервер всегда дает ответы серии 200-х годов. Все ошибки со стороны сервера заключены в Response object, поэтому я должен создавать ошибки из него.

Типичный ответ выглядит следующим образом ;где свойство APP_CODE представляет работоспособность ответа, APP_CODE: '001' означает, что я могу прочитать его из массива результатов. Если это APP_CODE="002" или APP_CODE="002", то есть ошибка, и я должен прочитать массив ошибок и т. Д.

{ "input": null, 
  "warningMessages": [],
  "errorMessages": [
     "Please enter at least 3 characters"
  ],
  "numFound": 0,
  "results": [],
  "APP_CODE": "003"
}

Стратегия решения : Есть несколько стратегий, которые я могупродолжайте, но тот, который мне нужен, находится на уровне обслуживания, используя map в pipe, генерирует специфичную для приложения ошибку, затем catchError(), и передает ее компоненту, чтобы решить, как показать его в тосте или как-то вформа.

Поэтому код должен выглядеть следующим образом

private handleError(error: MyAppError) {
    console.log('******got you inside handleError', error);
    return throwError(error);
  }

private handleErrorAppCodes(res: any[]) {
    console.log('**** handleErrorAppCodes ****');
    console.log("%o", res);
    if (res["APP_CODE"] === "003") {
    console.log('dataAccess service| Results APP_CODE is', res["APP_CODE"]);
    return throwError(new MyAppError('APP CODE 3:' + res["errorMessages"][0]));
  } 
}
  return res;
}


getMyObject(objectName: string):Observable<any[]> {

let url = 'thisIsAUrl';

return this.http.get<any[]>(url).pipe(
  map(this.handleErrorAppCodes),
  catchError(this.handleError)
);

Кажется, ошибка спуска. НО я получаю следующую ошибку во время компиляции

error TS2322: Type 'Observable<any[] | Observable<never>>' is not assignable to type 
'Observable<any[]>'.Type 'any[] | Observable<never>' is not assignable to type 'any[]'.
Type 'Observable<never>' is missing the following properties from type 'any[]': length, pop,  
push,concat, and 25 more.

Я также пытался map(res => this.handleErrorAppCodes(res)) Ошибка компиляции похожа.

Позже я попытался map<any[]>(this.handleErrorAppCodes), но я получил

error TS2558: Expected 2 type arguments, but got 1.

1 Ответ

0 голосов
/ 07 октября 2019

Здравствуйте, попробуйте присвоить параметру оператора карты ту же форму, что и у входа вашего обработчика, как этот

map((res: any[]) => this.handleError(res));

...