>我正在编写一个 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
inpipe
,生成特定于应用程序的错误然后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