У меня есть глобальная защита, которая зарегистрирована в приложении в 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.
В заявлении ничего не говорится об охранниках, поэтому я предполагаю, что то, что я пытаюсь достичь, невозможно.
Я не могу понять, почему ошибка возникла внутри охранника. не перехватывается перехватчиком. Приведенные выше фрагменты кода включают только те части, которые, по моему мнению, были необходимы для вопроса, если кто-то считает, что требуется дополнительная информация. тогда я предоставлю это.