在 Angular 的后端响应中创建隐藏的自定义错误



>我正在编写一个 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"
}

解决方案策略:我可以使用几种策略,但我想要的策略是在服务级别使用mapinpipe,生成特定于应用程序的错误然后catchError(),并将其传递给组件以决定如何在 Toast 中或以某种方式以形式显示它。

因此,代码应如下所示

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.

您好,尝试为地图运算符参数提供与您的处理程序输入相同的形状,如下所示

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

不知道是否仍然相关,但据我了解,您正在混合何时返回由 rxJS 处理的简单转换以及何时返回适当的可观察量。

鉴于您总是有一个 200(当事情发生对或错时,很可能不包括您的服务器何时出现 ka-boom!如果无法处理请求以按您想要的方式对其进行调整,则很可能会收到 500 范围错误。这些应该被一个策略所涵盖......很可能在顶层管道catchError()

对于与 200 个响应捆绑在一起的错误,您可能希望将它们切换为数据可观察量(旧of(res)(,当响应不包含错误时,否则throwError(YourErrorsFromResponse)

这样,您基本上可以延迟由流人工创建的 ok Vs 错误响应。当 switchMap 操作结束时,您将正常传递正确的数据,或者捕获并处理错误 ls,就好像初始响应本身是错误一样。

我仍然认为这可能不是一个好主意,但如果这是您必须使用的(即:第三方 API 或硬要求(,那么这就是我解决问题的方式。

https://stackblitz.com/edit/example-catch-error

最新更新