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);

Relaterade artiklar