40. Post, Patch y Delete

 Manejo de Peticiones POST, PATCH y DELETE en NestJS

En este post, exploraremos cómo implementar los endpoints básicos para un CRUD (Create, Read, Update, Delete) en NestJS, específicamente para el manejo de peticiones POST, PATCH y DELETE.

El Controlador Base

Comenzamos con un controlador básico que ya tiene implementados los métodos GET:

typescript
Copy
Download
import { Controller, Get, Param } from '@nestjs/common';
import { CarsService } from './cars.service';

@Controller('cars')
export class CarsController {
  constructor(private readonly carsService: CarsService) {} // Inyección de dependencias

  @Get()
  getAllCars() {
    return this.carsService.findAll();
  }

  @Get(':id')
  getCarById(@Param('id') id: string) {
    return this.carsService.findOneById(+id); // "+id" convierte string a number
  }
 @Post()
  createCar(@Body() body: any) {
    return body;
  }

  @Patch(':id')
  updateCar(
    @Param('id', ParseIntPipe) id: number,
    @Body() body: any
  ) {
    return body;
  }

  @Delete(':id')
  deleteCar(@Param('id', ParseIntPipe) id: number) {
    return {
      method: 'delete',
      id
    };
  }
}

Implementando POST para Crear Recursos

Para crear nuevos recursos, utilizamos el método POST. NestJS nos proporciona el decorador @Body() para acceder fácilmente al cuerpo de la petición:

typescript
Copy
Download
import { Body, Post } from '@nestjs/common';

@Post()
createCar(@Body() body: any) {
  return body;
}

El cuerpo de la petición puede enviarse de diferentes formas:

  • Como JSON (el más común)

  • Como formulario (form-data)

  • Como x-www-form-urlencoded

NestJS maneja automáticamente estos formatos sin necesidad de configuración adicional.

Implementando PATCH para Actualizar Recursos

Para actualizar recursos existentes, usamos PATCH (también podríamos usar PUT). Aquí combinamos parámetros de ruta con el cuerpo de la petición:

typescript
Copy
Download
import { Patch, ParseIntPipe } from '@nestjs/common';

@Patch(':id')
updateCar(
  @Param('id', ParseIntPipe) id: number,
  @Body() body: any
) {
  return body;
}

Usamos ParseIntPipe para convertir automáticamente el parámetro de ruta id de string a number.

Implementando DELETE para Eliminar Recursos

Finalmente, para eliminar recursos usamos DELETE. Normalmente solo necesitamos el ID del recurso a eliminar:

typescript
Copy
Download
import { Delete } from '@nestjs/common';

@Delete(':id')
deleteCar(@Param('id', ParseIntPipe) id: number) {
  return {
    method: 'delete',
    id
  };
}

CRUD Completo

Juntando todo, nuestro controlador queda así:

typescript
Copy
Download
import { Controller, Get, Param, Post, Body, Patch, Delete, ParseIntPipe } from '@nestjs/common';
import { CarsService } from './cars.service';

@Controller('cars')
export class CarsController {
  constructor(private readonly carsService: CarsService) {}

  @Get()
  getAllCars() {
    return this.carsService.findAll();
  }

  @Get(':id')
  getCarById(@Param('id') id: string) {
    return this.carsService.findOneById(+id);
  }

  @Post()
  createCar(@Body() body: any) {
    return body;
  }

  @Patch(':id')
  updateCar(
    @Param('id', ParseIntPipe) id: number,
    @Body() body: any
  ) {
    return body;
  }

  @Delete(':id')
  deleteCar(@Param('id', ParseIntPipe) id: number) {
    return {
      method: 'delete',
      id
    };
  }
}

Próximos Pasos

En futuros posts cubriremos:

  • Validación de datos entrantes

  • Manejo adecuado de errores

  • Transformación de datos con DTOs

  • Implementación completa del servicio

Este es solo el comienzo de lo que podemos hacer con NestJS para construir APIs robustas y mantenibles.

¿Qué otras dudas tienes sobre el manejo de peticiones HTTP en NestJS? ¡Déjalo en los comentarios!

Comentarios

Entradas más populares de este blog

48. ValidationPipe - Class Validator y Class Transformer

49. Pipes Globales - A nivel de Aplicación

34. Desactivar Prettier