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{}