Фильтр исключений NestJS и TypeORM: получение статуса не является функцией

Я разрабатываю приложение с использованием NestJS и TypeORM. Моя цель — поймать ошибки TypeORM, и это можно сделать с помощью фильтры исключений.

Но моя проблема в том, что я сталкиваюсь с этой ошибкой:

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

Это похоже на этот пост на github, в котором обсуждается проблема, но он не работает с моей стороны.

Вот моя установка:

@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
....

Я объявил это глобально, поэтому,

main.ts

app.useGlobalFilters(new TypeORMQueryExceptionFilter())

app.module.ts

....
providers: [

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

Если у вас есть идея решить, почему getStatus() в HttpException не определено, это будет большой помощью.

Обновлять

Поскольку эта строка предполагает catch(exception: HttpException, host: ArgumentsHost) { по отношению к @Catch(QueryFailedError), я могу предположить, что HttpException — неправильный тип исключения параметра. Это должно быть, если когда-либо, catch(exception: QueryFailedError, host: ArgumentsHost) { вместо этого.

Таким образом, поскольку структура данных QueryFailedError такова:

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

Я считаю, что const status = exception.getStatus(); не нужен, поэтому мы можем переписать или исключить const status = exception.getStatus() на const status = exception.driverError(). Это относится к примеру здесь.

Поскольку QueryFailedError не представляет никаких кодов ошибок http в своих свойствах, в одном из решений может потребоваться жестко закодировать ответ статуса http следующим образом:

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

Может ли кто-нибудь подтвердить это, возможно, я просто сделал что-то не так, так как exception: HttpException все равно должен работать?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
13
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

экземпляры QueryFailedError не имеют метода getStatus. Исправьте типы вашего фильтра:

@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>();

Спасибо за подтверждение

Desu 10.04.2022 17:57

Другие вопросы по теме