为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理 NestJS 中的 TypeORM 错误?

如何处理 NestJS 中的 TypeORM 错误?

神不在的星期二 2022-01-07 21:14:45
我想创建一个自定义异常过滤器来处理不同类型的 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    }  }}
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

文档中,它说:

@Catch()装饰可以采用单个参数,或逗号分隔的列表。这使您可以一次为多种类型的异常设置过滤器。

所以在你的情况下,你可以写:

@Catch(QueryFailedError, EntityNotFoundError)


查看完整回答
反对 回复 2022-01-07
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

要处理不同类型的 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 {

    catch(exception: unknown, host: ArgumentsHost) {

        const ctx = host.switchToHttp();

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

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

        let message = (exception as any).message.message;

        let code = 'HttpException';


        Logger.error(message, (exception as any).stack, `${request.method} ${request.url}`);


        let status = HttpStatus.INTERNAL_SERVER_ERROR;

        

        switch (exception.constructor) {

            case HttpException:

                status = (exception as HttpException).getStatus();

                break;

            case QueryFailedError:  // this is a TypeOrm error

                status = HttpStatus.UNPROCESSABLE_ENTITY

                message = (exception as QueryFailedError).message;

                code = (exception as any).code;

                break;

            case EntityNotFoundError:  // this is another TypeOrm error

                status = HttpStatus.UNPROCESSABLE_ENTITY

                message = (exception as EntityNotFoundError).message;

                code = (exception as any).code;

                break;

            case CannotCreateEntityIdMapError: // and another

                status = HttpStatus.UNPROCESSABLE_ENTITY

                message = (exception as CannotCreateEntityIdMapError).message;

                code = (exception as any).code;

                break;

            default:

                status = HttpStatus.INTERNAL_SERVER_ERROR

        }


        response.status(status).json(GlobalResponseError(status, message, code, request));

    }

}



import { Request } from 'express';

import { IResponseError } from './response.error.interface';


export const GlobalResponseError: (statusCode: number, message: string, code: string, request: Request) => IResponseError = (

    statusCode: number,

    message: string,

    code: string,

    request: Request

): IResponseError => {

    return {

        statusCode: statusCode,

        message,

        code,

        timestamp: new Date().toISOString(),

        path: request.url,

        method: request.method

    };

};



export interface IResponseError {

    statusCode: number;

    message: string;

    code: string;

    timestamp: string;

    path: string;

    method: string;

}


查看完整回答
反对 回复 2022-01-07
  • 2 回答
  • 0 关注
  • 832 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号