No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

15 Días
7 Hrs
59 Min
48 Seg

Separación de responsabilidades

9/23
Recursos

NestJS le da mucha importancia a los Principios SOLID en el desarrollo de software para mantener las buenas prácticas de codificación. Una de ellas es la responsabilidad única.

Qué es la responsabilidad única

La S de SOLID hace referencia a “Single Responsibility” y recomienda que cada pieza de software debe tener una única función. Por ejemplo, un controlador de productos no debería encargarse de categorías o de usuarios. Se debe crear un controlador para cada entidad que la aplicación necesite.

Lo mismo ocurre con los métodos. Un método para la obtención de datos solo debe realizar dicha acción y no estar actualizando o manipulando los datos de otra manera.

Responsabilidades en NestJS

En NestJS, una buena práctica es crear un directorio llamado controllers donde se agruparán todos los controladores que tu aplicación necesite. Ese ya es un buen paso para mantener el orden en tu proyecto.

Apóyate del CLI de NestJS para autogenerar código rápidamente con el comando nest generate controller <controller-name> o en su forma corta nest g co <controller-name>.

Es una buena forma de comenzar a seguir las buenas prácticas a la hora de escribir código y estructurar una aplicación.

Controllers y responsabilidades

nest g cor controllers/categories --flat
src/controllers/categories.controller.ts

import { Controller, Get, Param } from '@nestjs/common';

@Controller('categories') // 👈 Route
export class CategoriesController {

  @Get(':id/products/:productId')
  getCategory(
    @Param('productId') productId: string,
    @Param('id') id: string
  ) {
    return `product ${productId} and ${id}`;
  }
}

nest g co controllers/products --flat
src/controllers/products.controller.ts


import { Controller, Get, Query, Param } from '@nestjs/common';

@Controller('products') // 👈 Route
export class ProductsController {
  @Get()
  getProducts(
    @Query('limit') limit = 100,
    @Query('offset') offset = 0,
    @Query('brand') brand: string,
  ) {
    return `products limit=> ${limit} offset=> ${offset} brand=> ${brand}`;
  }

  @Get('filter')
  getProductFilter() {
    return `yo soy un filter`;
  }

  @Get(':productId')
  getProduct(@Param('productId') productId: string) {
    return `product ${productId}`;
  }
}

src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ProductsController } from './controllers/products.controller';
import { CategoriesController } from './controllers/categories.controller';

@Module({
  imports: [],
  controllers: [
   AppController,
   ProductsController, // 👈 New controller
   CategoriesController  // 👈 New controller
  ],
  providers: [AppService],
})
export class AppModule {}

Contribución creada por: Kevin Fiorentino.

Aportes 33

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para crear controladores puedes usar el generador de código de NestJS con el siguiente comando:
nest g co controllers/categories --flat

Para memorizar los comandos basicos para generar modulo controlador y servicio yo lo utilizo recordando la palabra Mocos (si, mocos)

nest g mo products
nest g co products
nest g s products

Y esto me crea la carpeta con los archivos que necesito.

Hola a todos, en mi caso se me hace mejor agregarlos los controladores por carpetas 😁

nest g co controllers/products
nest g co controllers/categories
nest g co controllers/brands
nest g co controllers/users
nest g co controllers/costumers
nest g co controllers/orders

Codigo para una arquitectura de carpetas escalable, si en un futuro el proyecto tiene reviews o cualquier feature lo insertamos dentro de modules/review, ademas de poder incorporar DTOs e Interfaces dentro de estas subcarpetas.

nest g co modules/order/controller/order --flat
nest g mo modules/order/module/order --flat
nest g s modules/order/service/order --flat
nest g co modules/user/controller/user --flat
nest g mo modules/user/module/user --flat
nest g s modules/user/service/user --flat
nest g co modules/customer/controller/customer --flat
nest g mo modules/customer/module/customer --flat
nest g s modules/customer/service/customer --flat
nest g co modules/category/controller/category --flat
nest g mo modules/category/module/category --flat
nest g s modules/category/service/category --flat
nest g co modules/product/controller/product --flat
nest g mo modules/product/module/product --flat
nest g s modules/product/service/product --flat
nest g co modules/brand/controller/brand --flat
nest g mo modules/brand/module/brand --flat
nest g s modules/brand/service/brand --flat

Este es el resultado graficamente:

nest g co controllers/orders --flat
nest g co controllers/users --flat
nest g co controllers/customers --flat
nest g co controllers/categories --flat
nest g co controllers/products --flat
nest g co controllers/brands --flat   

Siento que agrupar los controllers en una sola carpeta no lo hace tan mantenible ni modularizado el proyecto como lo predica NestJS y Angular

Muy buen curso!!! todo muy bien explicado! Es primera vez que tomo un curso con este profesor y la verdad es que es de los mejores que he visto. Espero que el curso siga con la misma calidad hasta finalizarlo. Felicitaciones @Nicolas Molina.

La arquitectura de carpestas no es trivial es como para una clase entera, no todas escalan ni trabajan igual, hay alguna referencia dependiendo de como se trabaje, en las arquitecturas hexagonales proponen algunas, aun no se cual es mejor 😭

Que hermoso es Nest.js

Estoy probando usar vertical slicing y hexagonal architecture. Los slices serían módulos de Nest y dentro irían: infrastructure, application, dominion. Quedaría algo así (recorte del tree): ├── src │ ├── app.controller.spec.ts │ ├── app.controller.ts │ ├── app.module.ts │ ├── app.service.ts │ ├── brands │ │ └── infrastructure │ │ ├── brands.controller.spec.ts │ │ └── brands.controller.ts │ ├── categories │ │ └── infrastructure │ │ ├── categories.controller.spec.ts │ │ └── categories.controller.ts │ ├── customers │ │ └── infrastructure │ │ ├── customers.controller.spec.ts │ │ └── customers.controller.ts │ ├── main.ts │ ├── orders │ │ └── infrastructure │ │ ├── orders.controller.spec.ts │ │ └── orders.controller.ts │ ├── products │ │ └── infrastructure │ │ ├── products.controller.spec.ts │ │ └── products.controller.ts │ └── users │ └── infrastructure │ ├── users.controller.spec.ts │ └── users.controller.ts

Yo los separé de esta manera:

nest g nest g res controllers/categories --no-spec
nest g nest g res controllers/users --no-spec

Esto genera los: module,service,controller
El --no-spec es para que no me genere los archivos de test

Qué hermoso es NestJS!.. dioj mio

Hola, para el reto simplemente debemos correr los comandos:

nest g controller controllers/orders --flat
nest g controller controllers/customers --flat
nest g controller controllers/users --flat
nest g controller controllers/brands --flat

y luego creamos los métodos correspondientes dentro de los controladores

En personal me parece mas ordenado tener una carpeta por cada controller
Si estan haciendo este curso en 2024, y tienen nestjs/[email protected] y al intentar generar lo que sea con el comando: ```js nest g [lo que sea] ``` Y les surge el siguiente error: ```js Error: Cannot read properties of undefined (reading 'text') Failed to execute command: node @nestjs/schematics:controller --name=products --no-dry-run --no-skip-import --language="ts" --source-root="src" --spec --no-flat --spec-file-suffix="spec" ```Estuve investigando y hay varias razones, pero más importante, varias soluciones. Intente con todas: 1\) Agregar el paquete @nestjs/schematics al global. ```js npm i -g @nestjs/schematics ```2) Utilizar [email protected], este me funcionó a mí, parece que la versión [email protected] que viene por defecto tiene conflictos con CLI de Nest, y por alguna razón no lo han solucionado.
Hay una extensión BUENÍSIMA que ayuda a crear los archivos con sólo dos clicks, se llama "NEST TYPEORM", con sólo dar Click derecho en la carpeta (normalmente /src) donde queremos crear nuestro "Servicio completo" (Módulo, Controlador y Servicio), luego vamos a la opción de nuestra extensión "Nest Typeorm" y se despliega otro menú donde nos permite escoger qué queremos crear, si le damos la opción FULL, nos creará todos los archivos de una vez... ![](https://static.platzi.com/media/user_upload/image-23287261-bb2d-4141-a9de-7947f3a36b81.jpg)
Me gusta que por defecto aplique vertical slicing. Separado sólo de la manera clean architecture, en proyectos grandes se hace mas tedioso saber que archivo afecta a que parte

Para memorizar los comandos basicos para generar modulo controlador y servicio yo lo utilizo recordando la palabra Mocos (si, mocos) nest g mo products nest g co products nest g s products Y esto me crea la carpeta con los archivos que necesito.

Es bueno de dejar para este curso los controllers jutnos pero para un proyecto real es recomendable trabajar de una manera moudular porque si no se vuelve desordenado el proyecto

Si decidiste usar pnpm y no te funciona bien la CLI de Nest
intenta ejecutando:

pnpm nest g co products

Diagrama de Componentes

De manera acertada, cuando organizamos nuestros recursos demos de considerar 2 cosas:
.

  1. Framework a utilizar. Definido o establecido por la herramienta en curso.
  2. Arquitectura. Del cual, se extiende del framework pero que acordamos como equipo mediante un estándar.

.
En nuestro caso, se extiende de la arquitectura MVC de la siguiente forma:
.

.
En este diagrama se demuestra que nuestro modelo será gestionada por un ORM a futuro por Prisma que nos permitirá delegar capas como DTO (Data-Transfer-Object) y DAO (Data-Access-Object).
.

Nota. Recomiendo utilizar alias en desarrollo de servidor ya que permitirá una versatilidad al momento de visualizar el origen de los elementos que estamos incorporando.

.
.


.

ⴵ Repositorio GitHub: Vizualla

.


.

la separación en carpetas también puede depender de lo escalable que vaya a ser tu API. pues también se puede separar en módulos con todos sus recursos, o hacer como en el video una carpeta para controladores otra para los servicios y todo lo que deseas incorporar.

Puede ser útil para probar rápido desde la terminal los endpoints:

curl "localhost:3000/products?brand=platzi" 

Principio de una sola responsabilidad (SOLID) - Nest

Me pones muy nervioso no usando el intellisence para los imports automáticos -_-

Por que se define el SRP como hacer una cosa ó entenderlo como una unica responsabilidad, es cierto que si, pero la premisa es, “un modulo, debe tener una y solo una razon para cambiar …”

crear controladores dentro de una sola carpeta llamada controllers

crear nuevos controladores

I ❤️ NestJS 🐈

Espera un momento app.module.ts hola Angular ajja

👏

Ojo, creo que eso de borrar la ruta de un controlador, en realidad es obligatorio no opcional.

Para mi en lo personal divido mis controladores y servicios en módulos:

nest g co module/order/controllers/order --flat
nest g co module/user/controllers/user --flat
nest g co module/customer/controllers/customer --flat
nest g co module/category/controllers/category --flat
nest g co module/product/controllers/product --flat
nest g co module/brand/controllers/brand --flat

Entonces luego dentro de cada módulo creo los servicios