javascript - NestJS och TypeORM Undantagsfilter: Get Status är inte en funktion


Jag utvecklar en app med NestJS och TypeORM. Mitt mål är att fånga TypeORM-fel och det kan göras med hjälp av undantagsfilter.

Men mitt problem är att jag stöter på detta fel:

(node:345) UnhandledPromiseRejectionWarning: TypeError: exception.getStatus is not a function

Detta är liknande detta GitHub-inlägg som diskuterar problemet, men det fungerar inte för mig.

Här är min uppsättning:

@Catch(QueryFailedError)
export class TypeORMQueryExceptionFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const response = ctx.getResponse<Response>();
        const request = ctx.getRequest<Request>();
        const status = exception.getStatus(); //error here
....

Jag har deklarerat detta globalt, så

main.ts

  app.useGlobalFilters(new TypeORMQueryExceptionFilter())

app.module.ts

....
providers: [

        {
            provide: APP_FILTER,
            useClass: TypeORMQueryExceptionFilter
        }
    ]
...

Om du har en idé om varför getStatus() av HttpException är odefinierad, skulle det vara en stor hjälp.

Uppdatering

Som denna rad antyder catch(exception: HttpException, host: ArgumentsHost) { i relation till @Catch(QueryFailedError), kan jag anta att HttpException är fel typ för parametern exception. Det borde vara, om någonsin, catch(exception: QueryFailedError, host: ArgumentsHost) { istället.

Således, eftersom QueryFailedError-datastrukturen är denna:

export declare class QueryFailedError extends TypeORMError {
    readonly query: string;
    readonly parameters: any[] | undefined;
    readonly driverError: any;
    constructor(query: string, parameters: any[] | undefined, driverError: any);
}

Jag tror att const status=exception.getStatus(); inte är nödvändigt så vi skulle kunna skriva om eller ta bort const status=exception.getStatus() till const status=exception.driverError(). Detta är relaterat till exemplet här.

Eftersom QueryFailedError inte representerar några http-felkoder i sina egenskaper, kan en lösning vara att hårdkoda http-statussvaret på detta sätt:

response
            .status(500)
            .json({
                statusCode: 500,
                timestamp: new Date().toISOString(),
                path: request.url,
            });

Kan någon validera detta eftersom det kan vara att jag bara gjorde något fel då exception: HttpException borde fungera ändå?

Svar #1

instanser av QueryFailedError har inte metoden getStatus. Åtgärda typerna på ditt filter:

@Catch(QueryFailedError)
export class TypeORMQueryExceptionFilter implements ExceptionFilter {
    catch(exception: QueryFailedError, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const response = ctx.getResponse<Response>();
        const request = ctx.getRequest<Request>();

Relaterade artiklar