NestJS处理服务异常

时间:2020-02-25 20:33:27

标签: nestjs

我正在使用NestJS应用程序,在该应用程序中,我的服务并非总是由控制器或任何http请求调用的。 Cron调度程序会调用某些服务来定期获取数据。

在这种情况下处理错误的最佳方法是什么?我实现了一个“包罗万象”的异常过滤器,但是当我的服务被“内部”调用时(不是通过控制器/请求),就不会捕获到错误并且我有未捕获的Promise错误。

1 个答案:

答案 0 :(得分:2)

在这里查看我的问题:Use global nest module in decorator

此装饰器捕获类方法的错误并将其记录下来。日志记录部分不是必需的,您可以实现自己的错误处理逻辑。

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()添加到服务类方法中