猿问

如何处理 NestJS 中的 TypeORM 错误?

我想创建一个自定义异常过滤器来处理不同类型的 TypeORM 错误。我查看了TypeORM 错误类,似乎 TypeORM 中没有像MongoError这样的东西。


我想做一些类似于1FpGLLjZSZMx6k 的答案的东西,这就是我到目前为止所做的。


import { QueryFailedError } from 'typeorm';


@Catch(QueryFailedError)

export class QueryFailedExceptionFilter implements ExceptionFilter {

  catch(exception: QueryFailedError, host: ArgumentsHost) {

    const context = host.switchToHttp();

    const response = context.getResponse<Response>();

    const request = context.getRequest<Request>();

    const { url } = request;

    const { name } = exception;

    const errorResponse = {

      path: url,

      timestamp: new Date().toISOString(),

      message: name,

    };


    response.status(HttpStatus.BAD_REQUEST).json(errorResponse);

  }

}


例如,如果我需要捕获另一个错误EntityNotFoundError,我必须编写相同的代码,这是一项非常繁琐的任务。


如果我可以通过如下所示的单个过滤器处理错误,那就太好了。有任何想法吗?


@Catch(TypeORMError)

export class EntityNotFoundExceptionFilter implements ExceptionFilter {

  catch(exception: MongoError, host: ArgumentsHost) {

    switch (exception.code) {

      case some error code:

        // handle error

    }

  }

}


神不在的星期二
浏览 833回答 2
2回答

小唯快跑啊

在文档中,它说:的@Catch()装饰可以采用单个参数,或逗号分隔的列表。这使您可以一次为多种类型的异常设置过滤器。所以在你的情况下,你可以写:@Catch(QueryFailedError,&nbsp;EntityNotFoundError)

白猪掌柜的

要处理不同类型的 TypeOrm 错误,如果异常构造函数匹配任何 TypeOrm 错误(来自 node_modules\typeorm\error),您可以切换/ case。此外, (exception as any).code 将提供发生的实际数据库错误。注意 @catch() 装饰器是空的,以便捕获所有错误类型。import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus, Logger } from '@nestjs/common';import { Request, Response } from 'express';import { QueryFailedError, EntityNotFoundError, CannotCreateEntityIdMapError } from 'typeorm';import { GlobalResponseError } from './global.response.error';@Catch()export class GlobalExceptionFilter implements ExceptionFilter {&nbsp; &nbsp; catch(exception: unknown, host: ArgumentsHost) {&nbsp; &nbsp; &nbsp; &nbsp; const ctx = host.switchToHttp();&nbsp; &nbsp; &nbsp; &nbsp; const response = ctx.getResponse<Response>();&nbsp; &nbsp; &nbsp; &nbsp; const request = ctx.getRequest<Request>();&nbsp; &nbsp; &nbsp; &nbsp; let message = (exception as any).message.message;&nbsp; &nbsp; &nbsp; &nbsp; let code = 'HttpException';&nbsp; &nbsp; &nbsp; &nbsp; Logger.error(message, (exception as any).stack, `${request.method} ${request.url}`);&nbsp; &nbsp; &nbsp; &nbsp; let status = HttpStatus.INTERNAL_SERVER_ERROR;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; switch (exception.constructor) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case HttpException:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status = (exception as HttpException).getStatus();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case QueryFailedError:&nbsp; // this is a TypeOrm error&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status = HttpStatus.UNPROCESSABLE_ENTITY&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message = (exception as QueryFailedError).message;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; code = (exception as any).code;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case EntityNotFoundError:&nbsp; // this is another TypeOrm error&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status = HttpStatus.UNPROCESSABLE_ENTITY&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message = (exception as EntityNotFoundError).message;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; code = (exception as any).code;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case CannotCreateEntityIdMapError: // and another&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status = HttpStatus.UNPROCESSABLE_ENTITY&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message = (exception as CannotCreateEntityIdMapError).message;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; code = (exception as any).code;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status = HttpStatus.INTERNAL_SERVER_ERROR&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; response.status(status).json(GlobalResponseError(status, message, code, request));&nbsp; &nbsp; }}import { Request } from 'express';import { IResponseError } from './response.error.interface';export const GlobalResponseError: (statusCode: number, message: string, code: string, request: Request) => IResponseError = (&nbsp; &nbsp; statusCode: number,&nbsp; &nbsp; message: string,&nbsp; &nbsp; code: string,&nbsp; &nbsp; request: Request): IResponseError => {&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; &nbsp; statusCode: statusCode,&nbsp; &nbsp; &nbsp; &nbsp; message,&nbsp; &nbsp; &nbsp; &nbsp; code,&nbsp; &nbsp; &nbsp; &nbsp; timestamp: new Date().toISOString(),&nbsp; &nbsp; &nbsp; &nbsp; path: request.url,&nbsp; &nbsp; &nbsp; &nbsp; method: request.method&nbsp; &nbsp; };};export interface IResponseError {&nbsp; &nbsp; statusCode: number;&nbsp; &nbsp; message: string;&nbsp; &nbsp; code: string;&nbsp; &nbsp; timestamp: string;&nbsp; &nbsp; path: string;&nbsp; &nbsp; method: string;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答