1

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

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

我想知道如何catch在我的service

我想将此exception filter应用于service

因为我是初学者。有什么好的申请方法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();
    }
  }
}
4

2 回答 2

1

首先是您错过的细节:

你必须制作你的HttpExceptionFilter工具ExceptionFilter

不幸的是,只有三个作用域可以应用这样的过滤器:方法作用域、控制器作用域或全局作用域。如果您想将过滤器应用于您的服务,您可能希望将过滤器应用于实现您的控制器,EventService如下所示:

@UseFilters(new HttpExceptionFilter())
@Controller()
export class YourEventController {}
于 2020-10-20T15:04:51.300 回答
0

根据官方文档,为了使用 your HttpExceptionFilter,您可以在控制器级别绑定它,如下所示:

@Post()
@UseFilters(HttpExceptionFilter) // <== here it goes
async createEvent(@Body() eventParam: EventRequest) {
  return await this.eventService.createEvent(eventParam);
}

让我知道它是否有帮助:)

于 2020-10-20T10:05:26.807 回答