No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

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 鈥淪ingle 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 30

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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.

Que hermoso es Nest.js

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 馃槶

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

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
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

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, 鈥渦n 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