根据文档我开发了
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();
}
}
}
首先是你错过的细节:
你必须让你的
HttpExceptionFilter
工具ExceptionFilter
.
不幸的是,只有三个范围可以应用这样的过滤器:方法范围、控制器范围或全局范围。如果您想将过滤器应用于您的服务,您可能希望将过滤器应用于实现您的
EventService
的控制器,如下所示:
@UseFilters(new HttpExceptionFilter())
@Controller()
export class YourEventController {}
根据官方文档,为了使用你的
HttpExceptionFilter
,你可以在控制器级别绑定它,像这样:
@Post()
@UseFilters(HttpExceptionFilter) // <== here it goes
async createEvent(@Body() eventParam: EventRequest) {
return await this.eventService.createEvent(eventParam);
}
如果有帮助请告诉我:)
我设法让它在应用程序范围内工作,具有 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 {}