Как @Catch () интерфейс в фильтре NestJS - PullRequest
2 голосов
/ 23 марта 2019

Я работаю над NestJS, который использует Firebase для аутентификации. Я хочу перехватить все и только исключение из Firebase (например, когда пользователи используют токен с истекшим сроком действия) и преобразовать их в реальные ошибки HTTP. Я хочу, чтобы HttpExceptions обрабатывался фильтром по умолчанию.

Я пытался создать новый фильтр, но когда я пытаюсь установить декоратор как @Catch(FirebaseError) он не компилируется, говоря 'FirebaseError' only refers to a type, but is being used as a value here. Я также попытался оставить @Catch() без аргументов и указать тип FirebaseError в функции catch, но он перехватывает каждое исключение.

// This code doesn't work
import { FirebaseError } from 'firebase';
import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common';

@Catch(FirebaseError)
export class FirebaseExceptionFilter implements ExceptionFilter<FirebaseError> {
  catch(exception: FirebaseError, host: ArgumentsHost) {
    // handle the exception
  }
}

Я хочу, чтобы этот фильтр вызывался для FirebaseError исключений, но если я напишу @Catch(FirebaseError), он не скомпилируется, если я напишу @Catch(), он перехватит каждое исключение.

1 Ответ

0 голосов
/ 24 марта 2019

Посмотрите исходный код из ExceptionFilter:

ExceptionMetatype => exception instanceof ExceptionMetatype,

instanceof проверки не работают на интерфейсах, только на классах. (Требуется информация о прототипе во время выполнения.)


Вы можете использовать Interceptor для преобразования ошибок в HttpExceptions. См. этот ответ . (Конечно, здесь вы также не можете использовать instanceof с интерфейсом.)

...