Nest JS обрабатывает сервисные исключения - PullRequest
0 голосов
/ 25 февраля 2020

Я работаю над приложением Nest JS, где мои службы не всегда вызываются контроллером или каким-либо http-запросом. Скорее, некоторые службы вызываются расписанием cron для периодической выборки данных.

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

1 Ответ

0 голосов
/ 10 марта 2020

См. Мой вопрос здесь: Использовать модуль глобального гнезда в декораторе

Этот декоратор ловит ошибки метода класса и регистрирует их. В части регистрации нет необходимости, вы можете реализовать свой собственный журнал обработки ошибок c.

import { Inject } from '@nestjs/common';
import { LoggerService } from '../../logger/logger.service';

export function logErrorDecorator(bubble = false) {
  const injectLogger = Inject(LoggerService);

  return (target: any, propertyKey: string, propertyDescriptor: PropertyDescriptor) => {
    injectLogger(target, 'logger'); // this is the same as using constructor(private readonly logger: LoggerService) in a class

    //get original method
    const originalMethod = propertyDescriptor.value;

    //redefine descriptor value within own function block
    propertyDescriptor.value = async function(...args: any[]) {
      try {
        return await originalMethod.apply(this, args);
      } catch (error) {
        const logger: LoggerService = this.logger;

        logger.setContext(target.constructor.name);
        logger.error(error.message, error.stack);

        // rethrow error, so it can bubble up
        if (bubble) {
          throw error;
        }
      }
    };
  };
}

С помощью этого декоратора вы можете просто добавить logErrorDecorator () к вашим методам класса обслуживания

...