J'essaie d'ajouter un traitement d'erreur à un service en suivant le Angular guide .
Extrait pertinent:
private handleError (error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
Cependant, je reçois une erreur TypeScript:
error TS2339: Property 'error' does not exist on type '"" | Promise<any>'.
Property 'error' does not exist on type '""'.
Je peux comprendre pourquoi cela se produit-- error.json()
renvoie un Promise<any>
et la ligne suivante contenant body.error
ne fonctionnerait pas car il n'y a pas de propriété error
. Cependant, il semble qu'il faut s'attendre à ce qu'un objet JSON soit renvoyé à partir de .json()
. Pourquoi cela et que me manque-t-il si le guide Angular n’est pas?
La même chose vient de m'arriver. Cela se produit lorsque vous ne parvenez pas à importer l'objet Response.
import { Response } from '@angular/http';
Non, ça ne marchera pas parce que vous avez écrit:
const body = error.json() || '';
Ce qui signifie que body
peut être une chaîne vide et qu'une chaîne ne possède pas la propriété error
.
Cela devrait être mieux:
const body = error.json() || { error: null };
Oh, error.json()
renvoie une Promise
, ce qui signifie que vous ne pourrez pas utiliser ce bloc synchrone. Vous devrez plutôt:
error.json().then(body => {
if (!body) {
body = "";
}
const err = body.error || JSON.stringify(body);
const errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
});
J'ai eu le même problème, j'ai finalement trouvé cette solution.
.catch(error => {
let errMsg: string;
const body = JSON.parse(error._body);
if (body) {
errMsg = body.error
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Promise.reject(errMsg);
});