Hur man skriver en felhanteringsdekorerare i TypeScript
En av kontrollerens metoder ser ut på följande sätt:
@httpGet('')
public async getProducts(@queryParam() queryBody: object): Promise<Products[]> {
return this.productService.getProducts(queryBody);
}
Jag skulle vilja ha en dekoratör, låt oss säga @Catch() (om den anropas på detta sätt ska det vara en dekoratörfabrik) som kan användas på den metoden och vars ansvar skulle vara att fånga fel/undantag som kommer från servicemetoden. Jag vill bara separera felhanteringslogiken från logiken i kontrollern.
Svar #1
Skapa en funktion som kommer att vara dekoratören catchError och i funktionen ändra befintlig funktion med en omsluten funktion. Du kan komma åt befintliga bar funktionen via descriptor.value.
Det finns ett problem att returtyper kan ändras från catchError-funktionen och kommer att vara osynliga i TypeScript.
class Foo {
@catchError
public bar(message: string): string {
if(message === "x") {
throw new Error("x not valid");
}
return message;
}
}
function catchError(target: any,propertyName: any,descriptor: any) {
const method = descriptor.value;
descriptor.value = function(...args: any) {
try {
return method.apply(target, args);
} catch(error) {
throw new Error(`Special error message: ${error.message}`);
}
};
}
const foo = new Foo();
const result = foo.bar("x");
console.log(result);
