Tu primera experiencia con Node.js

1

¿Dónde aprender backend con Node.js actualizado?

2

Todo lo que aprenderás sobre backend con Node.js

3

¿Qué es Node.js?

4

¿Qué es Node.js y para qué sirve?

5

Diferencias entre Node.js y JavaScript

6

Resumen: Diferencias Nodejs y Javascript

7

Instalación de Node.js

8

Arquitectura orientada a eventos

9

Node.js para la web

Manejo y uso de Streams con Node.js

10

Introducción a streams

11

Readable y Writable streams

12

Duplex y Transforms streams

Uso de utilidades de Node.js

13

Sistema operativo y sistema de archivos

14

Administrar directorios y archivos

15

Consola, utilidades y debugging

16

Clusters y procesos hijos

Crea tu primer proyecto en Express.js

17

¿Qué es Express.js y para qué sirve?

18

Creando tu primer servidor con Express.js

19

Request y Response Objects

Aprende a crear un API con REST

20

Anatomía de una API Restful

21

Estructura de una película con Moockaru

22

Implementando un CRUD en Express.js

23

Métodos idempotentes del CRUD

24

Implementando una capa de servicios

Cómo conectarse con librerías externas en Express.js

25

Creación de una BD en MongoAtlas

26

Conexión a MongoAtlas una instancia de MongoDB

27

Conexión con Robot3T y MongoDB Compass a una BD

28

Implementación de las acciones de MongoDB

29

Conexión de nuestros servicios con MongoDB

Conoce como funcionan los Middleware en Express.js

30

¿Qué es un middleware? Capa de manejo de errores usando un middleware

31

Manejo de errores asíncronos y síncronos en Express

32

Capa de validación de datos usando un middleware

33

¿Qué es Joi y Boom?

34

Implementando Boom

35

Implementando Joi

36

Probar la validación de nuestros endpoints

37

Middlewares populares en Express.js

Implementa tests en Node.js

38

Creación de tests para nuestros endpoints

39

Creación de tests para nuestros servicios

40

Creación de tests para nuestras utilidades

41

Agregando un comando para coverage

42

Debugging e inspect

Despliega tu primera aplicación en Express.js

43

Considerando las mejores prácticas para el despliegue

44

Variables de entorno, CORS y HTTPS

45

¿Cómo implementar una capa de manejo de caché?

46

¿Cómo contener tu aplicación en Docker?

47

Despliegue en Now

Conclusiones

48

¿Qué aprendiste en este curso?

No tienes acceso a esta clase

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

Implementando un CRUD en Express.js

22/48
Recursos

Las siglas CRUD vienen de las palabras en inglés:

  • Create - crear
  • Read - leer
  • Update - actualizar
  • Delete - eliminar

Aportes 42

Preguntas 13

Ordenar por:

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

movies.js

const moviesMock = [
  {
    id: 'd2a4a062-d256-41bb-b1b2-9d915af6b75e',
    title: 'Notti bianche, Le (White Nights)',
    year: 2019,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.',
    duration: 66,
    contentRating: 'G',
    source: 'https://ovh.net/semper/rutrum/nulla/nunc.jsp',
    tags: [
      'Action|Adventure',
      'Action|Adventure|Thriller',
      'Horror|Western',
      'Horror|Thriller',
      'Comedy|Romance|Sci-Fi',
      'Adventure|Animation|Children|Comedy|Fantasy',
      'Drama'
    ]
  },
  {
    id: '3f951b6d-03fa-4fb0-a7a1-188c0abe9e06',
    title: "King Solomon's Mines",
    year: 2019,
    cover: 'http://dummyimage.com/800x600.png/dddddd/000000',
    description:
      'Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.\n\nPraesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.\n\nMorbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.',
    duration: 77,
    contentRating: 'NC-17',
    source:
      'https://multiply.com/dui/proin/leo/odio/porttitor/id/consequat.jsp',
    tags: [
      'Comedy',
      'War',
      'Drama|Horror',
      'Comedy|Drama|Romance',
      'Drama|Thriller',
      'Comedy',
      'Action|Drama|War',
      'Drama'
    ]
  },
  {
    id: 'c030eed2-dad1-47f4-b660-9cfb7170eadb',
    title: 'Inhuman Resources (Redd Inc.)',
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.\n\nPhasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.\n\nProin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.',
    duration: 142,
    contentRating: 'PG',
    source: 'http://odnoklassniki.ru/porta/volutpat/erat.jsp',
    tags: ['Crime|Drama|Thriller']
  },
  {
    id: 'c672ff92-c373-49f4-9c5b-f0151d304361',
    title: 'Fortress',
    year: 2019,
    cover: 'http://dummyimage.com/800x600.png/cc0000/ffffff',
    description:
      'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.\n\nSuspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.',
    duration: 172,
    contentRating: 'PG',
    source: 'https://un.org/tortor/id/nulla/ultrices/aliquet/maecenas.png',
    tags: ['Drama', 'Drama|Mystery|Thriller', 'Drama|Thriller']
  },
  {
    id: '5ec75811-1001-4612-9743-67296d90071a',
    title: 'Transylmania',
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.',
    duration: 155,
    contentRating: 'G',
    source: 'http://pagesperso-orange.fr/varius/ut/blandit/non/interdum/in.js',
    tags: [
      'Crime|Drama|Mystery|Thriller',
      'Crime|Drama|Mystery|Thriller',
      'Comedy|Sci-Fi',
      'Adventure|Comedy|Sci-Fi',
      'Drama'
    ]
  },
  {
    id: '63d718f2-4e37-4090-ad57-dd2cf22393e6',
    title: "Big Girls Don't Cry... They Get Even (Stepkids)",
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.\n\nQuisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.\n\nPhasellus in felis. Donec semper sapien a libero. Nam dui.',
    duration: 173,
    contentRating: 'R',
    source: 'https://nih.gov/erat/quisque/erat/eros.jpg',
    tags: ['Action|Drama', 'Comedy']
  },
  {
    id: 'e9093aaa-daf2-4e32-aa6b-c3d79d0d9120',
    title: 'Amreeka',
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.',
    duration: 115,
    contentRating: 'R',
    source: 'https://umich.edu/cursus/id/turpis/integer/aliquet.aspx',
    tags: ['Comedy|Romance', 'Drama|Thriller', 'Animation|Children']
  },
  {
    id: '94f4fa76-fcf9-4aa3-a18f-f54bb7d462bc',
    title: 'Hollow Man',
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/ff4444/ffffff',
    description:
      'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.\n\nPhasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.',
    duration: 158,
    contentRating: 'NC-17',
    source: 'https://psu.edu/duis/bibendum/morbi/non/quam.aspx',
    tags: ['Drama', 'Thriller']
  },
  {
    id: '9a2e5834-4eb5-4083-8c21-87fdfc0b3b52',
    title: 'Hard Target',
    year: 2018,
    cover: 'http://dummyimage.com/800x600.png/dddddd/000000',
    description:
      'Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.\n\nMorbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.',
    duration: 173,
    contentRating: 'PG',
    source: 'https://flavors.me/lorem/ipsum/dolor/sit.json',
    tags: [
      'Animation|Comedy',
      'Documentary',
      'Action|Fantasy|Horror',
      'Thriller',
      'Comedy|Crime',
      'Drama'
    ]
  },
  {
    id: '11fff70c-c312-4791-b8b4-1a0665edd79e',
    title: 'Siete minutos (Seven Minutes)',
    year: 2019,
    cover: 'http://dummyimage.com/800x600.png/5fa2dd/ffffff',
    description:
      'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.\n\nIn congue. Etiam justo. Etiam pretium iaculis justo.',
    duration: 62,
    contentRating: 'PG',
    source:
      'http://columbia.edu/eget/orci/vehicula/condimentum/curabitur/in/libero.html',
    tags: ['Action|Adventure|Comedy|Drama|War', 'Animation', 'Drama']
  }
];

module.exports = {
  moviesMock
};

Dejare esto por aqui: HTTP Cats 😂.

“En la sección de enlaces te voy a dejar información sobre cuales son los códigos Http que se pueden usar”

La sección de enlaces: 🦗🦗 (Cri)

Si quieren saber acerca de cuando se debe aplicar cada código http hay un diagrama enorme. Siempre es útil tenerlo a la mano si no sabes que código mandar dependiendo la situación 🕵️‍♂️

https://github.com/for-GET/http-decision-diagram

Códigos de estado de respuesta HTTP:
https://developer.mozilla.org/es/docs/Web/HTTP/Status

const express = require('express');
const { moviesMock } = require('../utils/mocks/movies');

function moviesApi(app) {
    const router = express.Router();
    app.use("/api/movies", router);

    router.get("/", async function(req , res, nex) {
        try {
            const movies = await Promise.resolve(moviesMock);
            res.status(200).json({
                data: movies,
                message: 'movies listos'
            });
        } catch (error) {
            nex(error);
        }
    });
}

module.exports = moviesApi;

funcionando

porque no se usa PUT y si patch? cual es la diferencia ?

¿Es recomendable utilizar arrow functions en node?

Para quienes usen windows sin el WSL,
en package.json es:

  "dev": "SET DEBUG=app:* & nodemon index",
    "start": "SET NODE_ENV=production & node index"

Por alguna razon que no lo logro ver la promesa no esta funcionando!?

const express = require('express');

const { moviesMock } = require('../utils/mocks/movies');

function moviesApi(app){
    const router = express.Router();
    app.use("/api/movies",router);
    
    router.get("/",async function(req, res,next){
        try{
            const movies = await Promise.resolve(moviesMock);
            
            res.status(200).json({
                data: movies,
                message: "Movies listed"
            });
           
        } catch(err){
            next(err);
        }
    });
}

module.exports = moviesApi;

Otra alternativa a Postman es Insomnia, muy similar a Postman.
Aquí les dejo el link: https://insomnia.rest/download/

Compañeros, alguien sabe, cual es la ventaja de utilizar, clases, analizando el código, creo que todo se puede hacer en funciones, pero quisiera saber las ventajas o desventajas de ambos y en que caso debe usarse cada uno.

Si no tienen Postman, igual pueden hacer la consulta GET en el navegador en: http://localhost:3000/api/movies

server.js

const express = require('express')
const morgan = require('morgan')
const app = express()

app.use(morgan('dev'))

// Routes
app.use(require('./routes/index.routes'))
app.use('/movies',require('./routes/movies.routes'))


module.exports = app;


index.js

const {config} = require('../src/config/index')
const app = require('./server')

const main = async () => {
    await app.listen(config.port)
    console.log(`servidor en el puerto ${config.port}`)
}

main()

Para quienes usen VSCode

En VsCode, hay una extensión que es una alternativa a Postman. llamada Thunder Client. En lo personal, la prefiero sobre Postman porque no tengo que cambiar de ventana para hacer los requests.

https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client

Excelente, primero se trabaja con datos en crudo con proyección a como los serviría la base de datos.

Buena clase, me gusta la organizacion de los archivos aunque es facil perderse al principio cuando no estas familiarizado con los terminos y las funcionalidades

Los códigos de estado de Http aqui

No tenia clara la diferencia entre PUT y PATCH entonces investigue un poco.
PUT creara un nuevo item en nuestro request reemplazando al original, de este no existir lo creara.
PATCH modificara un ítem ya existente por lo que solo alterara los campos que nosotros le indiquemos. No creara uno nuevo a diferencia de PUT

mas info aqui

¿Solo me pasa a mi o el tema del editor de texto del profesor hace que se vea medio borroso el texto?

Si alguno se perdió en la clase anterior o esta apurado por alguna razón (Hola #JS CHALLENGE), aquí les dejo el ARCHIVO JSON ya generado.

Buenísimo.

CRUD: Resume las funciones requeridas por un usuario para crear y gestionar datos…

Create => Crear Registros.
Read = > Leer Registros.
Update => Actualizar Registros.
Delete => Borar Registros.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Les dejo el link para que hagan simulacion de una base de datos (MOCK):
https://www.mockaroo.com/

Genial clase !!!

Excelente clase!!

Script Index

Muy buena clase!

tengo un error:
ReferenceError: regeneratorRuntime is not defined

Les dejo un Gist que hice sobre los verbos HTTP, espero que les sirva 😄
HTTP verbs

Gran clase, si es de gran ayuda Mockaroo!

Les dejo un enlace a una cheat sheet de los codigos disponibles para HTTP,espero les sirva !

buenas compañeros, alguien me podría decir porque no me salen los datos de las películas en postman, y solo queda el mensaje de que se listaron…

![](

gracias si me pueden explicar

Trabajar con express es facil, me gusta 😄

/*
  Creando rutas con express
*/
const express = require('express');
const { moviesMock } = require('../utils/mocks/movies');

function moviesApi(app){
  /*
    Middleware de rutas, siempre se va a consultar la ruta
    /api/movies antes que cualquier otra.
  */
  const router = express.Router();
  app.use('/api/movies', router);

  router.get('/', async function(req, res, next){
    try {
      const movies = await Promise.resolve(moviesMock);

      res.status(200).json({
        data: movies,
        message: 'Movies listed'
      });

    } catch(error){
      next(error);
    }
  });
}

module.exports = moviesApi;```

Qué clase genial!!!

TIP:

En el caso de que algún endpoint no regreses ningún dato (como en el caso de DELETE), lo mejor es regresar un status 204 (No content), no 200. No afecta en nada, pero es el estándar.

Vamos bien :v

bien dicho gigachad!!!

Muy interesante

que sofware deberai usar postman o insomnia para realizar las peticiones.

Create - crear
Read - leer
Update - actualizar
Delete - eliminar

Hablando de los status code recuerdo que hace tiempo encontré esto pagina

https://http.cat/

que mejor que explicarlo con gatitos