Как написать декоратор обработки ошибок в машинописи - PullRequest
0 голосов
/ 12 апреля 2020

Один из методов контроллера выглядит следующим образом:

@httpGet('')
public async getProducts(@queryParam() queryBody: object): Promise<Products[]> {
    return this.productService.getProducts(queryBody);
}

Я бы хотел иметь декоратор, скажем, @Catch() (если он вызывается так, то это должна быть фабрика декораторов), который может быть используется в этом методе, и его ответственность будет заключаться в том, чтобы отлавливать ошибки / исключения, возникающие из метода обслуживания. Я просто хочу отделить логи c обработки ошибок от логи c в контроллере.

1 Ответ

2 голосов
/ 12 апреля 2020

Создайте функцию, которая будет декоратором catchError, и в функции измените существующую функцию с упакованной функцией. Вы можете получить доступ к существующей функции bar через descriptor.value.

. Существует проблема, связанная с тем, что возвращаемые типы могут меняться с функции catchError и будут невидимы в машинописи.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...