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:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

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 馃槀.

鈥淓n 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