import Moment from "moment" import { Catch, HttpException, ExceptionFilter, ArgumentsHost, } from "@nestjs/common" import { Request, Response } from "express" import { HttpResponseBody } from "../interface" export interface HttpExceptionFilterHandler { (request:Request,response:Response):void | Promise } @Catch() export class HttpExceptionFilter implements ExceptionFilter { private readonly handlerList:HttpExceptionFilterHandler[] = [] async catch(exception:HttpException,context:ArgumentsHost) { try { var httpContext = context.switchToHttp(); var request = httpContext.getRequest(); var response = httpContext.getResponse(); var exceptionStatus = exception.getStatus(); var exceptionResponse = exception.getResponse(); } catch(e) { console.log(exception) exceptionStatus = 400 exceptionResponse = { message:"Node异常触发", data:exception.message } } for ( let handler of this.handlerList.values() ) { await handler(request,response) } let exceptionBody:HttpResponseBody = { code:exceptionStatus, status:false, message:"", data:{}, path: request.url, timestamp:Moment().format("X") } if ( typeof exceptionResponse === "string" ) { exceptionBody.message = exceptionResponse } else { exceptionBody.message = exceptionResponse["message"] if (exceptionResponse["data"]) exceptionBody.data = exceptionResponse["data"] } response.status(exceptionStatus) response.json(exceptionBody) } public addHandler(handler:HttpExceptionFilterHandler):this { this.handlerList.push(handler) return this } }