Установка кода состояния от перехватчика невозможна (см. Этот выпуск ), потому что:
- иногда коды состояния ответа зависят от исключений, и выполняются фильтры исключенийпосле перехватчиков логика
- контроллера глобального ответа - это последний шаг, выполняемый непосредственно перед отправкой окончательного результата по сети (это место, где приходят коды состояния по умолчанию).
Таким образом, ваш код состояния будет переопределен кодом по умолчанию 200/201 или фильтром исключений.
В качестве (хакерского) обходного пути вы можете использовать фильтры исключений для установки кода состояния в перехватчиках:
1) Создайте свое собственное исключение в качестве оболочки вокруг HttpException
:
export class StatusException extends HttpException {
constructor(data, status: HttpStatus) {
super(data, status);
}
}
2) Создайте фильтр исключений, который устанавливает код ответа и возвращает данные:
@Catch(StatusException)
export class StatusFilter implements ExceptionFilter {
catch(exception: StatusException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
console.log(`Setting status to ${status}`);
response.status(status).json(exception.message);
}
}
3) Вместо установки ответа выведите соответствующее исключение в ваш перехватчик:
@Injectable()
export class StatusInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next): Observable<any> {
return next.handle().pipe(
map((data: any) => {
if (data.text === 'created') {
throw new StatusException(data, HttpStatus.CREATED);
} else {
throw new StatusException(data, HttpStatus.ACCEPTED);
}
}),
);
}
}
4) Используйте его в вашем контроллере:
@UseFilters(StatusFilter)
@UseInterceptors(StatusInterceptor)
@Controller()
export class AppController {
@Get(':param')
async get(@Param('param') param) {
return { text: param };
}
}
Кроме того, вы можете ввести @Res()
в свой контроллер и напрямую контролировать код ответа (но также потерять перехватчики, фильтры исключений и т. Д.)