Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Separación de responsabilidades con express.Router

8/25
Recursos

Aportes 28

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Ya maneje la organización de manera distinta usando clases en typescript, y dentro de las clases manejo los middlewares, routes o listen del servidor mediante métodos.

Mi estructura de directorios es algo así

el index.ts ubicado en el directorio raíz inicialice la clase y posteriormente ejecuta el método listen

import {Server} from "./app/server"

const server = new Server();
server.listen()

y el index.ts dentro de app/server/ se encuentra la clase donde se ejecuta express

import express from "express";
import products from "../routes/products";
export class Server {
  port: string | number;
  app: express.Application;
  paths: { [index: string]: string };
  constructor() {
    this.port = 8000,
    this.app = express(),
    this.paths = {
      products: "/api/products",
      users: "/api/users",
      categories: "/api/categories"
    };
    this.routes();
  }

  routes(): void {
    this.app.use(this.paths.products, products)
  }

  listen(): void {
    this.app.listen(this.port, () => {
      console.log(`Corriendo en ${this.port}`);
    });
  }
}

y para las rutas es muy similar a como lo realiza el instructor, ejemplo para products.ts

import { Router } from "express";
import faker from "faker";
const router = Router();

router.get("/", (req, res) => {
  const { size } = req.query;
  const products = [];
  const limit = size || 100;
  for (let index = 0; index < limit; index++) {
    products.push({
      name: faker.commerce.productName(),
      price: parseInt(faker.commerce.price(), 10),
      image: faker.image.imageUrl(),
    });
  }
  res.send(products);
});

router.get("/filter", (req, res) => {
  res.json({ msg: "Soy un filtro" });
});

router.get("/:id", (req, res) => {
  const { id } = req.params;
  res.send({ id, name: "product1", price: "1000" });
});

export default router;

Los tan respetados principios SOLID https://profile.es/blog/principios-solid-desarrollo-software-calidad/
me he dado cuenta que el ir entendiendolos poco a poco, nos hace ser mejores desarrolladores.

Amigos, acá unos conceptos que le pueden aclarar dudas.

Express.Router

Crea un controlador(handler) de rutas modulares y montables. Una instancia de Router es un sistema de enrutamiento y middleware completo, por esa razón lo podemos tomar como si fuera una mini app.

Cada modulo de nuestras rutas es una mini aplicación en la que creamos sus rutas independientes y podemos incluirle middlewares, que se ejecutarán cuando se coincida con el path.

Qué es un middleware?

Un middleware es un bloque de código que se ejecuta entre la petición que hace el usuario (request) hasta que la petición llega al servidor.

Fuente:

Middlewares en Node.js

App.use

app.use Lo que hace es montar un middleware en la ruta especificada. Por ejemplo:

var express = require('express')
var router = express.Router()

// middleware específico a este router
router.use('/', function (req, res, next) {
  console.log('Hola, soy el middleware')
  next() // se utiliza para que se ejecute el router.get
})
// define the home page route
router.get('/', function (req, res) {
  res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
  res.send('About birds')
})

module.exports = router

Mi solución





Esta clase me encanto, lo dejo todo muy claro y muy bien explicado, llevaba meses preguntándome como debería yo hacer esto?! y hasta que por fin!! ahora me siento como que estoy apunto de Graduarme! jajaja

solución

const productsRouter = require('./productsRouter');
const usersRouter = require('./usersRouter');
const categoriesRouter = require('./categoriesRouter');

function routerApi(app) {
  app.use('/api/products', productsRouter);
  app.use('/api/users', usersRouter);
  app.use('/api/categories', categoriesRouter);
}

module.exports = routerApi;

Mi aporte, de mis clases preferidas de este curso

Que buenas recomendaciones sobre las formas de organizar el proyecto!

Mi solución

Para las personas que como yo son nuevos en estos temas dejo un enlace, que puede aclarar un poco el tema del uso del express.router que hace el profesor y que a mi parecer falto un poco profundizar en este tema para poder entenderlo algo mejor, espero y le pueda servir a alguien.
https://www.youtube.com/watch?v=HvMKOebT2Ik

Les comparto que agregue las rutas usuarios y categorías:

Categorias

const express = require('express');
const faker = require('faker');

const router = express.Router();

router.get('/',(req,res) => {
  const {size} = req.query;
  const limit = size || 10;
  const categories = [];
  for(let i = 0; i < limit; i++){
    categories.push({
      category:faker.commerce.productAdjective()
    })
  }
  res.json(categories);
});

router.get('/:id', (req,res) => {
  const {id} = req.params;
  res.json({
    id,
    category:faker.commerce.productAdjective()
  })
})

module.exports = router;

Usuarios

const express = require('express');
const faker = require('faker');

const router = express.Router();

router.get('/', (req,res) =>{
  const {size} = req.query;
  const limit = size || 10;
  const users = [];
  for(let i = 0; i < limit; i++){
    users.push({
      user:faker.internet.userName()
    })
  }
  res.json(users);
});

router.get('/:id', (req,res) => {
  const {id} = req.params;
  res.json({
    id,
    user:faker.internet.userName(),
  })
});

module.exports = router;

Desde faker es posible generar usuarios, es muy interesante lo que se puede generar con éste módulo, les comparto el link de donde pueden obtener más información: faker npm

https://expressjs.com/es/guide/routing.html les recomiendo que lean la siguiente lectura para profundizar

en este video se puede ver otra forma para esto, aplicando una arquitectura por capas https://platzi.com/clases/1689-nodejs-mongo-websockets/22632-conceptualmente-rutas-controladores-y-bases-de-dat/

así me quedó utilizando typescript

Nunca había entendido esto, ahora siento que todo se ajusta mejor.

Ahora ya tengo todo en módulos!!

Este profesor es genial!

crear rutas con index, crear modulos, ordenar las rutas express y dos clases desés de fakeer

Que buen profesor! explica muy bien y comenta cosas importantes
const productsRouter = require('./products.router');
const categoriesRouter = require('./categories.router');
const usersRouter = require('./users.router');

const prefixApi = '/api';

function routerApi(app) {
  app.use(`${prefixApi}/products`, productsRouter);
  app.use(`${prefixApi}/categories`, categoriesRouter);
  app.use(`${prefixApi}/users`, usersRouter);
}

module.exports = routerApi;

Este curso esta excelente, todo me esta quedando muy claro, de los mejores profes de platzi .

Excelente método para separar las responsabilidades y hacer nuestro código más legible y adaptable a cambios.
Esta fue mi solución:

Solo que me ocurre poner así

const productsRouter = require('./products.router');
const categoriesRouter = require('./categories.router');
const usersRouter = require('./users.router');
const ordersRouter = require('./orders.router');

function routerApi(app) {
  app.use('/api/products', productsRouter);
  app.use('/api/categories', categoriesRouter);
  app.use('/api/users', usersRouter);
  app.use('/api/orders', ordersRouter);
}

module.exports = routerApi;

Totalmente recomendado leer la documentacion oficial para entender mejor al profe. Lo que hemos visto hasta ahora aqui https://expressjs.com/en/guide/routing.html

Me gusta mucho esta clase que muestre de una manera simple como utilizar los principios SOLID en node

Me aporte sin duda la mejor clase del Mes

esta clase fue geniallllllllllll ¡¡¡

responsabilidades *