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

问题描述 投票:0回答:3

根据文档我开发了

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();
    }
  }
}
typescript exception nestjs
3个回答
2
投票

首先是你错过的细节:

你必须让你的

HttpExceptionFilter
工具
ExceptionFilter
.

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

EventService
的控制器,如下所示:

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

0
投票

根据官方文档,为了使用你的

HttpExceptionFilter
,你可以在控制器级别绑定它,像这样:

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

如果有帮助请告诉我:)


0
投票

我设法让它在应用程序范围内工作,具有 Request 范围,如下所示:

import { Module, Scope } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { ExceptionsFilter } from './exceptions.filter';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      scope: Scope.REQUEST,
      useClass: ExceptionsFilter,
    },
  ],
})
export class FiltersModule {}
© www.soinside.com 2019 - 2024. All rights reserved.