Перехватчик не ловит ошибку, выданную охранником в nestjs - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть глобальная защита, которая зарегистрирована в приложении в common.module.ts, который является глобальным модулем.

const HeaderGuardGlobal = {
    provide: APP_GUARD,
    useClass: HeaderGuard
};

@Global()
@Module({
    imports: [ LoggerModule ],
    providers: [ HeaderGuardGlobal ],
    exports: []
})

header.guard.ts:

async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const userName = request.headers[HEADERS.USER_NAME];

    if(!userName) {
        throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
    }

У меня есть перехватчик с контролем уровня authenticate-header.interceptor.ts

@Injectable()
export class setAuthenticateHeaderInterceptor<T> implements NestInterceptor<T, Response<T>> {
    public constructor() {}

    intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
        const req = context.switchToHttp().getRequest();
        const res = context.switchToHttp().getResponse();

        return next
        .handle()
        .pipe(
            catchError(err => {
                console.log('ERROR: ', err);
                    res.setHeader('sampleKey', 'sampleValue');
                    return throwError(err);
                })
            )
    }
}

user.controller.ts:

@Controller('user')
@UseInterceptors(setAuthenticateHeaderInterceptor)
export class ClientController {

Я пытаюсь добиться того, чтобы, когда header.guard.ts выбрасывает Forbidden исключение, authenticate-header.interceptor.ts перехватывает исключение и передает его в глобальный http-фильтр, но перед этим Я хочу добавить заголовок к объекту ответа.

Проблема, с которой я сталкиваюсь, заключается в том, что когда исключение выдается охранником, перехватчик не может его перехватить. Однако, когда та же ошибка выдается либо из обработчика маршрута, либо из службы, перехватчик может ее перехватить.

Я прошел request-lifecycle , чтобы понять контекст выполнения, и нашел приведенный ниже оператор в разделе перехватчиков .

любые ошибки, выдаваемые каналами, контроллерами или службами, можно прочитать в операторе перехватчика catchError.

В заявлении ничего не говорится об охранниках, поэтому я предполагаю, что то, что я пытаюсь достичь, невозможно.

Я не могу понять, почему ошибка возникла внутри охранника. не перехватывается перехватчиком. Приведенные выше фрагменты кода включают только те части, которые, по моему мнению, были необходимы для вопроса, если кто-то считает, что требуется дополнительная информация. тогда я предоставлю это.

1 Ответ

0 голосов
/ 07 апреля 2020

Документы правильно указывают, как вы упомянули,

Любые ошибки, вызванные каналами, контроллерами или службами, могут быть прочитаны в операторе перехватчика catchError.

Охранники, как указано ниже в разделе summary , выполняются до перехватчиков, и поэтому их ошибки не могут быть обнаружены в методе catchError перехватчика. Лучше всего было бы создать фильтр, расширяющий вашу GlobalFilter, добавить туда свою логику c, а затем позвонить super.catch(exception), чтобы вызвать остальные логи c.

...