typescript - 如何在nest.js中使用异常过滤器

标签 typescript exception nestjs

根据文档我开发了nest.js异常过滤器。

https://docs.nestjs.com/exception-filters

我想知道如何在我的服务中使用catch函数

我想将此异常过滤器应用到服务

因为我是初学者。有什么好的方法来应用exceptionfilter吗?

如果有人有意见,请告诉我。谢谢

import {
  ArgumentsHost,
  Catch,
  HttpException,
  HttpStatus,
  Logger,
} from '@nestjs/common';
import { Request, Response } from 'express';

@Catch()
export class HttpExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    console.log("exception",exception.getResponse());
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status =
      exception instanceof HttpException
        ? exception.getStatus()
        : HttpStatus.INTERNAL_SERVER_ERROR;

    const errorResponse = {
      code: status,
      timestamp: new Date().toLocaleDateString(),
      path: request.url,
      method: request.method,
      message: exception.message || null,
      error: exception.Error;
      
    };

    Logger.error(
      `${request.method} ${request.url}`,
      JSON.stringify(errorResponse),
      'ExceptionFilter',
    );

    response.status(status).json(errorResponse);
  }
}

我的服务如下

import { Injectable, InternalServerErrorException } from '@nestjs/common';
import { eventRepository } from 'src/repositories/event.repository';
import { EventRequest } from './dto/event.dto';
import { Event } from 'src/entities/event.entity';
import { InsertResult, Like } from 'typeorm';

@Injectable()
export class EventService {
  constructor(private readonly eventRepository: eventRepository) {}
  async createEvent(eventParam: EventRequest): Promise<Event> {
    const event = new Event();
    Object.entries(eventParam).forEach(param => {
      event[param[0]] = param[1];
    });
    try {
      const insertResult = await this.eventRepository.insert(event);
      const id = insertResult.identifiers[0].id
      const Result = await this.eventRepository.findOne(id);
      return Result;
    } catch (error) {
      console.log(error);
      throw new InternalServerErrorException();
    }
  }
}

最佳答案

首先是您错过的细节:

您必须使您的HttpExceptionFilter实现ExceptionFilter

不幸的是,只有三个范围可以应用这样的过滤器:method-scoped, controller-scoped, or global-scoped 。如果您想将过滤器应用到您的服务,您可能需要将过滤器应用到实现您的 EventService 的 Controller ,如下所示:

@UseFilters(new HttpExceptionFilter())
@Controller()
export class YourEventController {}

关于typescript - 如何在nest.js中使用异常过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64442704/

相关文章:

javascript - Angular 5 - 从子组件输入 [(ngModel)] 绑定(bind)更改父属性

android - 如何将 Ionic 3 与 android native 代码链接起来?

android - 播放视频时应用程序崩溃

java - 异常处理问题

postgresql - TypeORM 外键

nestjs - 在引导运行后运行组件(服务)方法的最佳方法是什么?

javascript - 从许多编译为 AMD 模块的 TypeScript 类创建单个 AMD 模块?

typescript - 除 Promise 之外的任何对象?

python - 如何忽略某些警告,而其他警告则从 Python 命令行转向异常?

mysql - 无法使用 leftjoin 从 2 个表中获取所有数据