Explicación Detallada del Controlador de NestJS: Manejo de Diferentes Métodos de Solicitud HTTP y Parámetros de Ruta

  • 877Palabras
  • 4Minutos
  • 08 Jul, 2024

NestJS es un marco para construir aplicaciones de servidor Node.js eficientes y escalables. El controlador es una parte importante de NestJS, encargado de manejar las solicitudes HTTP entrantes y devolver respuestas. Este artículo explicará en detalle cómo crear controladores en NestJS, manejar diferentes métodos de solicitud HTTP (como GET, POST, PUT, DELETE) y cómo utilizar parámetros de ruta y el cuerpo de la solicitud.

Descripción General del Controlador

El controlador se utiliza para definir las rutas en la aplicación y manejar las solicitudes entrantes. Cada controlador maneja un conjunto de solicitudes relacionadas, generalmente asociadas con un recurso específico (como usuarios, artículos, etc.). En NestJS, los controladores se definen a través de decoradores y métodos de clase.

Creación de un Controlador

En NestJS, los controladores se definen a través del decorador @Controller(). Aquí hay un ejemplo simple de un controlador:

1
import { Controller, Get } from "@nestjs/common";
2
3
@Controller("users")
4
export class UsersController {
5
@Get()
6
findAll() {
7
return "This action returns all users";
8
}
9
}

En el ejemplo anterior, definimos una clase UsersController y utilizamos el decorador @Controller('users') para marcarla como un controlador, estableciendo el prefijo de ruta como users. El método findAll está marcado con el decorador @Get(), lo que indica que maneja solicitudes GET.

Manejo de Diferentes Métodos de Solicitud HTTP

El controlador de NestJS puede manejar varios métodos de solicitud HTTP, incluyendo GET, POST, PUT, DELETE, entre otros. Aquí hay un ejemplo que muestra cómo manejar estos métodos en un controlador:

1
import {
2
Controller,
3
Get,
4
Post,
5
Put,
6
Delete,
7
Param,
8
Body,
9
} from "@nestjs/common";
10
11
@Controller("users")
12
export class UsersController {
13
@Get()
14
findAll() {
15
return "This action returns all users";
16
}
17
18
@Get(":id")
19
findOne(@Param("id") id: string) {
20
return `This action returns user with id ${id}`;
21
}
22
23
@Post()
24
create(@Body() createUserDto: CreateUserDto) {
25
return "This action adds a new user";
26
}
27
28
@Put(":id")
29
update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {
30
return `This action updates user with id ${id}`;
31
}
32
33
@Delete(":id")
34
remove(@Param("id") id: string) {
35
return `This action removes user with id ${id}`;
36
}
37
}

En el ejemplo anterior, definimos cuatro métodos para manejar diferentes métodos de solicitud HTTP:

  • findAll maneja solicitudes GET y devuelve todos los usuarios.
  • findOne maneja solicitudes GET con un parámetro de ruta y devuelve un usuario específico.
  • create maneja solicitudes POST y crea un nuevo usuario.
  • update maneja solicitudes PUT con un parámetro de ruta y actualiza un usuario específico.
  • remove maneja solicitudes DELETE con un parámetro de ruta y elimina un usuario específico.

Uso de Parámetros de Ruta

Los parámetros de ruta se utilizan para pasar parámetros en la URL. En NestJS, se pueden obtener los parámetros de ruta a través del decorador @Param(). Aquí hay un ejemplo:

1
import { Controller, Get, Param } from "@nestjs/common";
2
3
@Controller("users")
4
export class UsersController {
5
@Get(":id")
6
findOne(@Param("id") id: string) {
7
return `This action returns user with id ${id}`;
8
}
9
}

En el ejemplo anterior, el método findOne está definido con el decorador @Get(':id'), indicando una solicitud GET con un parámetro de ruta id. A través del decorador @Param('id'), podemos obtener el valor del parámetro de ruta id.

Uso del Cuerpo de la Solicitud

El cuerpo de la solicitud se utiliza para pasar datos en la solicitud, generalmente en solicitudes POST y PUT. En NestJS, se puede obtener el cuerpo de la solicitud a través del decorador @Body(). Aquí hay un ejemplo:

1
import { Controller, Post, Body } from "@nestjs/common";
2
3
class CreateUserDto {
4
readonly name: string;
5
readonly age: number;
6
}
7
8
@Controller("users")
9
export class UsersController {
10
@Post()
11
create(@Body() createUserDto: CreateUserDto) {
12
return `This action adds a new user with name ${createUserDto.name} and age ${createUserDto.age}`;
13
}
14
}

En el ejemplo anterior, el método create está definido con el decorador @Post(), indicando una solicitud POST. A través del decorador @Body(), podemos obtener los datos del cuerpo de la solicitud, y se utiliza el tipo CreateUserDto para restringir el tipo de datos.

Descripción de los Parámetros

  • @Controller(): Se utiliza para definir el controlador y especificar el prefijo de ruta.
  • @Get(), @Post(), @Put(), @Delete(): Se utilizan para definir rutas que manejan diferentes métodos de solicitud HTTP.
  • @Param(): Se utiliza para obtener los parámetros de ruta.
  • @Body(): Se utiliza para obtener el cuerpo de la solicitud.

DTO (Objeto de Transferencia de Datos)

DTO se utiliza para encapsular los datos de la solicitud. En el ejemplo anterior, definimos una clase CreateUserDto para encapsular los datos de la solicitud de creación de usuario:

1
class CreateUserDto {
2
readonly name: string;
3
readonly age: number;
4
}

Restricción de Tipo para Parámetros de Ruta y Cuerpo de la Solicitud

Utilizando la restricción de tipos de TypeScript, podemos asegurar que los tipos de datos de los parámetros de ruta y el cuerpo de la solicitud sean correctos. Aquí hay un ejemplo completo que muestra cómo usar parámetros de ruta y el cuerpo de la solicitud:

1
import { Controller, Get, Post, Put, Param, Body } from "@nestjs/common";
2
3
class UpdateUserDto {
4
readonly name: string;
5
readonly age: number;
6
}
7
8
@Controller("users")
9
export class UsersController {
10
@Get(":id")
11
findOne(@Param("id") id: string) {
12
return `This action returns user with id ${id}`;
13
}
14
15
@Post()
16
create(@Body() createUserDto: CreateUserDto) {
17
return `This action adds a new user with name ${createUserDto.name} and age ${createUserDto.age}`;
18
}
19
20
@Put(":id")
21
update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {
22
return `This action updates user with id ${id}, new name ${updateUserDto.name}, new age ${updateUserDto.age}`;
23
}
24
}

Conclusión

Este artículo explicó en detalle el controlador en NestJS, cómo crear controladores para manejar diferentes métodos de solicitud HTTP (como GET, POST, PUT, DELETE) y cómo utilizar parámetros de ruta y el cuerpo de la solicitud.