@historydev
Острая аллергия на анимешников

Как создать кастомный ответ на запрос с кривым json?

Здравствуйте. Изучаю nest, копаюсь с httpExceptionFilter, создал вывод по своему шаблону, проблем не было. Решил попробовать кинуть кривой json:

{
"id": 1",
"title": "1",
"message": "1"
}


Получил ответ не по шаблону:

{
    "status": 400,
    "response": {
        "statusCode": 400,
        "message": "Unexpected string in JSON at position 14",
        "error": "Bad Request"
    }
}


app.exceptionFilter.ts выглядит следующим образом:

import {ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpCode} from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
	catch(exception: HttpException, host: ArgumentsHost) {
		const ctx = host.switchToHttp();
		const response = ctx.getResponse<Response>();
		const request = ctx.getRequest<Request>();
		const status = exception.getStatus();
		let data = exception.getResponse();
		
		response
			.status(status)
			.json({
				status: status,
				response: data
			});
	}
}


items.controller.ts выглядит вот так:

import {
	Body,
	Controller,
	Delete,
	Get,
	HttpCode,
	HttpException,
	HttpStatus,
	Param,
	Post,
	Put, Req,
	Res, UseFilters, UsePipes
} from "@nestjs/common";
import {Response} from "express";
import {ItemsService} from "./items.service";
import {ItemDto} from "./dto/item.dto";
import {JoiValidationPipe} from "./items.validation.pipe";
import {item} from "./items.shemes";
import {HttpExceptionFilter} from "../app.exceptionFilter";

@Controller()

export class ItemsController {
	
	constructor(private readonly itemsService: ItemsService) {}
	
	@Get()
	async getAll(@Res() res: Response, items = this.itemsService.getAll()) {
		throw items.length < 1 ? new HttpException('', HttpStatus.NO_CONTENT) : new HttpException(items, HttpStatus.OK);
	}
	
	@Post()
	@UsePipes(new JoiValidationPipe(item))
	create(@Res() res: Response, @Body() dto:ItemDto) {
		throw !!dto ? new HttpException(this.itemsService.create(dto), HttpStatus.CREATED) : new HttpException({}, HttpStatus.BAD_REQUEST);
	}
	
	@Delete()
	delete(@Res({passthrough: true}) res:Response, @Body() body) {
		res.status(HttpStatus.ACCEPTED);
		return this.itemsService.delete(body.id);
	}
	
	@Put()
	update(@Res({passthrough: true}) res: Response, @Body() dto:ItemDto) {
		res.status(HttpStatus.ACCEPTED);
		return this.itemsService.update(dto);
	}
	
}


Я погуглил и пока не нашёл, как это исправить, я предполагаю что нужно переписать уже имеющийся badRequest, но я мало пока понимаю. Подскажите как поступить.

Спасибо.
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы