Как написать ответ от фильтров исключений nestjs с помощью nestfastify

У меня проблема с написанием настраиваемого HTTP-ответа из фильтров исключений nestjs
Я использую nest fastify one (не экспресс)
Я создаю настраиваемые фильтры исключений, которые перехватывают UserNotFoundException следующим образом:

@Catch(UserNotFoundException)
export class UserNotFoundExceptionFilter implements ExceptionFilter {
  catch(exception: UserNotFoundException, host: ArgumentsHost) {
    const errorResponse = new ErrorResponse<string[]>();
    const response = host.switchToHttp().getResponse();
    errorResponse.message = 'unauthorized exception'
    errorResponse.errors = [
      'invalid username or pass'
    ];
    response.status(401).json(errorResponse)

  }
}

я продолжаю получать response.status (...). json () не является функцией.

[Nest] 5400   - 05/17/2020, 00:27:26   [ExceptionsHandler] response.status(...).json is not a function +82263ms
TypeError: response.status(...).json is not a function

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

Я пытаюсь импортировать этот объект Response из экспресс-версии и обновить тип переменной response до Response (express), как показано ниже:

import {Response} from 'express';
 const response = host.switchToHttp().getResponse<Response>();

и все работает без сбоев.

Но я не хочу добавлять в свое приложение какие-то экспресс-функции, я просто хочу использовать nestjs fastify. Вы, ребята, знаете какой-нибудь класс, который может заменить этот объект Response из express? Или, если у вас есть другой более умный способ решить эту проблему, это также поможет

спасибо всем


person rizesky    schedule 16.05.2020    source источник


Ответы (1)


Если вы используете Fastify, вам необходимо использовать тип FastifyReply<ServerResponse> из fastify и http пакетов. Сам Fastify не имеет json метода для объекта ответа, но у него есть .send() метод, который JSON.stringify() будет использовать объект, если ему дан объект.

Хотя проект может построить, если вы используете объект Response из express, вы, вероятно, получите ошибку времени выполнения около response.status().json is not a function. Ниже должно работать правильно

import { FastifyReply } from 'fastify';

@Catch(UserNotFoundException)
export class UserNotFoundExceptionFilter implements ExceptionFilter {
  catch(exception: UserNotFoundException, host: ArgumentsHost) {
    const errorResponse = new ErrorResponse<string[]>();
    const response = host.switchToHttp().getResponse<FastifyReply<ServerResponse>>();
    errorResponse.message = 'unauthorized exception'
    errorResponse.errors = [
      'invalid username or pass'
    ];
    response.status(401).send(errorResponse)

  }
}

В целом Nest - это оболочка для Express и Fastify, и большая часть документации имеет отношение к Express, когда речь идет о параметрах, специфичных для библиотеки (например, Request и Response). Вам следует ссылаться на документацию Fastify, когда речь идет о подходах, специфичных для библиотеки.

person Jay McDoniel    schedule 16.05.2020