mer*_*ike 5 typescript angular
我想告知用户HTTP请求是否失败,而不必为每个HTTP请求编写额外的代码.
我有角度2的工作原型:
@Injectable()
export class MyErrorHandler extends ErrorHandler {
constructor() {
super(false);
}
handleError(error: any) {
this.tellUser(error);
super.handleError(error);
}
tellUser(error: any) {
// dig for the root cause
if (error.rejection) {
error = error.rejection;
}
if (error instanceof ViewWrappedError) {
error = error.originalError;
}
let message;
if (error instanceof Response) {
// TODO: localize and display nicely
const messages = {
0: "Could not connect to server",
}
message = messages[error.status] || ("The server reported a system error (HTTP " + error.status + ")");
} else {
message = "A system error occurred.";
}
console.warn(message);
}
}
Run Code Online (Sandbox Code Playgroud)
但ViewWrappedError已被Angular 4替换为
export function viewWrappedDebugError(err: any, context: DebugContext): Error {
if (!(err instanceof Error)) {
// errors that are not Error instances don't have a stack,
// so it is ok to wrap them into a new Error object...
err = new Error(err.toString());
}
_addDebugContext(err, context);
return err;
}
Run Code Online (Sandbox Code Playgroud)
其中,由于在HttpResponse上调用toString,因此很难查询状态代码......
我希望angular能够为集中式错误处理提供一个公共的,支持良好的API.除了解析错误消息之外,真的没有办法集中处理HTTP错误吗?
更新:我更喜欢组件可以轻松覆盖集中式错误处理.
我将这种逻辑集中在 a 中BaseService,然后继承它的每个服务。Angular 2 不提供Http Interceptors像以前的版本那样提供,使得这种东西很难处理。
import { Injectable } from \'@angular/core\';\nimport { Response } from \'@angular/http\';\nimport { Observable } from \'rxjs/Observable\';\nimport { NotificationService } from \'********\';\n\n\n@Injectable()\nexport class BaseService {\n protected url: string;\n protected http: Http;\n\n constructor(http: Http, protected notification: NotificationService) {\n this.http = http;\n }\n\n protected extractData(res: Response) {\n //\n // Depende do formato da response, algumas APIs retornam um objeto data e dentro deste o conteudo propriamente dito\n // Em minhas APIs sempre retorno diretamente o objeto que desejo\n //\n return res.json();\n }\n\n protected handleError(error: Response | any) {\n let erros: string[] = [];\n\n switch (error.status) {\n case 400:\n let res = error.json();\n\n //\n // Depende do formato, minhas APIs sempre retornar um objeto com array errors quando tenho 400\n //\n for (let index = 0; index < res.errors.length; index++) {\n let msg = res.errors[index];\n erros.push(msg);\n };\n\n this.notification.showMultipleWarn(erros);\n break;\n case 404:\n this.notification.showWarning(\'O recurso requisitado n\xc3\xa3o existe.\');\n break;\n case 406:\n case 409:\n case 500:\n this.notification.showError(\'Ocorreu um erro inesperado.\');\n break;\n default:\n this.notification.showError(\'Ocorreu um erro inesperado.\');\n break;\n }\n\n return Observable.throw(new Error(error.status));\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的博客文章,解释了一些不那么冗长的处理方法:Receitas Angular2: Interceptando erros HTTP de forma Global
\n\n这篇文章是用葡萄牙语写的,但代码可以给你一些提示。我现在正在一些大型项目中使用这种方法,而且效果很好。
\n| 归档时间: |
|
| 查看次数: |
3557 次 |
| 最近记录: |