Здравствуйте. Изучаю 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, но я мало пока понимаю. Подскажите как поступить.
Спасибо.