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

Typescript 如何在nest.js中使用异常过滤器,typescript,exception,nestjs,Typescript,Exception,Nestjs,根据我开发的文档nest.js异常过滤器 我想知道如何在我的服务中使用catch功能 我想将此异常过滤器应用于服务 因为我是初学者。有什么好方法可以应用例外过滤器 如果有人有意见,请告诉我。谢谢 import { ArgumentsHost, Catch, HttpException, HttpStatus, Logger, } from '@nestjs/common'; import { Request, Response } from 'express'; @Cat

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

我想知道如何在我的
服务中使用
catch
功能

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

因为我是初学者。有什么好方法可以应用
例外过滤器

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

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);
  }
}

导入{
奥古斯特,
接住,
HttpException,
HttpStatus,
记录器,
}来自“@nestjs/common”;
从“express”导入{Request,Response};
@捕获()
导出类HttpExceptionFilter{
捕获(异常:HttpException,主机:ArgumentsHost){
log(“exception”,exception.getResponse());
const ctx=host.switchToHttp();
const response=ctx.getResponse();
const request=ctx.getRequest();
常量状态=
HttpException的异常实例
?异常。getStatus()
:HttpStatus.INTERNAL\u SERVER\u错误;
常量错误响应={
代码:状态,
时间戳:新日期().toLocaleDateString(),
路径:request.url,
方法:request.method,
消息:exception.message | | null,
错误:异常。错误;
};
记录器错误(
`${request.method}${request.url}`,
stringify(errorResponse),
“例外过滤器”,
);
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();
    }
  }
}
从'@nestjs/common'导入{Injectable,InternalServerErrorException};
从'src/repositories/event.repository'导入{eventRepository};
从“./dto/event.dto”导入{EventRequest};
从'src/entities/Event.entity'导入{Event};
从'typeorm'导入{InsertResult,Like};
@可注射()
导出类事件服务{
构造函数(私有只读eventRepository:eventRepository){}
异步createEvent(eventParam:EventRequest):承诺{
const event=新事件();
Object.entries(eventParam).forEach(param=>{
事件[param[0]]=param[1];
});
试一试{
const insertResult=等待this.eventRepository.insert(事件);
常量id=insertResult.identifiers[0].id
const Result=wait this.eventRepository.findOne(id);
返回结果;
}捕获(错误){
console.log(错误);
抛出新的InternalServerErrorException();
}
}
}
根据,为了使用您的
HttpExceptionFilter
,您可以在控制器级别绑定它,如下所示:

@Post()

@使用过滤器(HttpExceptionFilter)//首先是您遗漏的一个细节:

您必须使您的
HttpExceptionFilter
实现
ExceptionFilter

不幸的是,只有三个作用域可以应用这样的筛选器:。如果要将筛选器应用于服务,可能需要将筛选器应用于实现
EventService
的控制器,如下所示:

@UseFilters(新的HttpExceptionFilter())
@控制器()
导出类YourEventController{}