Fundamentos de Programaci贸n

1

Bienvenida a Platzi: 驴qu茅 necesitas para tomar el curso?

2

驴C贸mo aprender programaci贸n?

3

Crea tu primer sitio web

4

Sitios web con HTML

5

Estructura de 谩rbol en HTML

6

Instalando tu primer editor de c贸digo

7

C贸mo declarar variables y usar prompt

8

Algoritmo de piedra, papel o tijera

9

Algoritmo avanzado de piedra, papel o tijera

10

Aleatoriedad

11

Refactor del c贸digo usando funciones

12

Ciclos

13

Gana 3 veces

14

Archivos de HTML y JavaScript

15

驴Qu茅 es el DOM?

Quiz: Fundamentos de Programaci贸n

Desarrollando un juego con HTML y JavaScript

16

Maquetaci贸n con HTML

17

Secci贸n de elegir mascota

18

驴D贸nde ubicar la etiqueta script? Conectando HTML con JavaScript

19

Escuchando eventos con JavaScript

20

addEventListener

21

Manipulaci贸n del DOM

22

Enemigos aleatorios

23

Ataques en JavaScript

24

Ataques aleatorios del enemigo

25

Imprimiendo ataques del enemigo

26

驴Ganaste, perdiste o empataste?

27

Tablas de verdad

28

Creando el contador de vidas

29

驴Qui茅n gan贸 el juego?

30

Reiniciando el juego

31

Ocultando elementos HTML con JS para mejorar la UX del juego

Quiz: Desarrollando un juego con HTML y JavaScript

Estilos con CSS

32

Anatom铆a de CSS

33

Tipos de display

34

Flexbox

35

Modelo de caja

36

Im谩genes para los Mokepones

37

Estilos del bot贸n

38

Adaptando HTML al dise帽o del juego

39

Layout: t铆tulo y ataques

40

Adaptando JavaScript al dise帽o del juego

41

CSS Grid

42

Responsive Design

43

Detalles finales

Quiz: Estilos con CSS

Optimizaci贸n de c贸digo

44

Revisi贸n de c贸digo

45

Don't repeat yourself (DRY)

46

Clases y objetos

47

Clases y objetos de Mokepon

48

Arrays o arreglos

49

Objetos vs. arreglos

50

Ciclos: manipulando el DOM con iteradores

51

Declaraci贸n lenta de variables

52

Una sola fuente de la verdad

53

Mascotas aleatorias con arreglos

54

Ataques din谩micos por cada mascota: extraer

55

Renderizado din谩mico en HTML

56

Eventos de click din谩micos

57

Secuencia de ataques del enemigo

58

Iniciando el combate

59

Resolviendo el reto de condicionales

60

Optimizando el frontend del juego

Quiz: Optimizaci贸n de c贸digo

Mapa con canvas

61

Introducci贸n a canvas: dibujando con JavaScript

62

Moviendo a Capipepo hacia la derecha

63

Movimiento hacia todas las direcciones

64

Movimientos con el teclado

65

Im谩genes y personajes de fondo

66

M茅todos en las clases

67

Obst谩culos y colisiones

68

Combate entre mokepones colisionados

69

Mapa responsive

70

Botones bonitos y viewport

Quiz: Mapa con canvas

Backend: videojuego multijugador

71

驴Qu茅 es backend?

72

Instalaci贸n de Node.js y NPM

73

Terminal de comandos y Node.js

74

Servidor web con Express.js

75

HTTP, localhost, servidores y puertos

76

Express.js y fetch: API REST con JavaScript

77

JSON y POST: mokepon online

78

Transmisi贸n de coordenadas

79

Mokepones din谩micos en el mapa

80

Optimizando el mapa del juego

81

Batalla entre jugadores

82

Consumiendo la API de ataques del enemigo

Quiz: Backend: videojuego multijugador

Pr贸ximos pasos

83

Probando el juego en varios dispositivos

84

驴Y ahora qu茅 curso tomar?

No tienes acceso a esta clase

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

Compra acceso a todo Platzi por 1 a帽o

Antes: $249

Currency
$209/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscr铆bete

Termina en:

15D
17H
12M
59S

Express.js y fetch: API REST con JavaScript

76/84
Recursos

Te encuentras desarrollando tu primer backend y tu primera API. Un backend est谩 compuesto por m煤ltiples endpoints que ser谩n utilizados por el front-end. Es momento de conectar ambos mundos.

驴Qu茅 es un endpoint?

Un nuevo t茅rmino que debes conocer y que siempre te acompa帽ar谩. Llamamos endpoint, o punto final, a cada URL que el backend exponer para que el front-end utilice, ya sea para la obtenci贸n de datos, creaci贸n, actualizaci贸n, etc.

Cada acci贸n que tu backend pueda realizar, la misma se ejecutar谩 a trav茅s de un endpoint.

Creando tu primer endpoint

Crear un endpoint con ExpressJS para enviar datos a un cliente es muy sencillo. Ya tienes tu servidor levantado, al mismo vamos a agregarle endpoints para la obtenci贸n de datos.

const express = require('express');
const app = express();
const port = 3000;

// Endpoint para obtener datos
app.get('/datos', (req, res) => {
  const datos = '12345';
  res.send(datos);
});

app.listen(port, () => {
  console.log(`隆Servidor listo!`);
});

Observa el endpoint /datos, el mismo devuelve un n煤mero. Accede a este endpoint desde la URL localhost:3000/datos y visualizar谩s los mismos en el navegador.

Pero la obtenci贸n de esta informaci贸n por parte de un cliente no suele realizarse directamente por el navagador. En su lugar, utilizamos un cliente HTTP para lograr conectar en backend y el front-end.

Conexi贸n de backend y front-end

Las consultas por parte de un front-end al backend se realizan por medio de un cliente HTTP. El mismo es una librer铆a que te permitir谩 hacer consultas a los endpoints y obtener informaci贸n.

Encontrar谩s muchos clientes HTTP en NPM. Para este ejemplo, usaremos uno llamado fetch que es propio de Javascript y no tendremos que instalar ninguna dependencia.

En los archivos JS de tu front-end, puedes realizar solicitudes HTTP de la siguiente manera:

fetch('http://localhost:3000/datos')
  .then(response => response.json())
  .then(data => {
    console.log(data);      // 12345
  });

Al ejecutar esta funci贸n as铆ncrona, obtendr谩s los datos del backend en la variable data pudiendo manipular los mismos y mostrarlos en el HTML de tu p谩gina.

Problemas de CORS

Puedes tener con un problema trivial al querer realizar consultas a un backend. Mejor dicho鈥 vas a tener este problema.

CORS es un peque帽o problema con el que te topar谩s mil veces en tu vida como programador. Pero no te preocupes, es de f谩cil resoluci贸n.

La consola de desarrollo de los navegadores te permitir谩 obtener m谩s informaci贸n cuando las cosas no funcionen. Si te encuentras con un error similar a:

Ejemplo problema de CORS

Indica un problema de CORS que significa, por sus siglas en espa帽ol, Intercambio de Recursos de Origen Cruzado. Es una medida de seguridad de los backend para que no cualquier cliente, o cualquier front-end, realice consultas al mismo.

El backend debe permitir expl铆citamente que un cliente haga consultas, de lo contrario rechazar谩 las mismas.

Habilita CORS instalando su respectiva dependencia con npm install cors y realizando la importaci贸n de la misma.

// Importamos CORS
const cors = require('cors');

// Activamos CORS
app.use(cors());

De esta forma, el backend est谩 listo para recibir consultas y el front-end podr谩 obtener los datos y trabajar con los mismos.

Conclusi贸n

Acabas de dar tu primer paso en el desarrollo full-stack, o sea, en el desarrollo backend y front-end. 隆Felicidades!

Es solo el primer paso para integrar estos los dos mundos y poder visualizar en un front-end, los datos que el backend procesa o almacena en una base de datos.


Contribuci贸n creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 61

Preguntas 50

Ordenar por:

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

o inicia sesi贸n.

Por si les causan dudas los .then

  1. fetch(url) hace un GET (una petici贸n para obtener algo) a la URL que se le especifique
  2. Esta funci贸n nos retornar谩 algo (lo que sea que se haya definido en el c贸digo del servidor).
  3. No podemos trabajar con lo que nos retorne directamente, ya que el servidor se tomar谩 un tiempo en responder.
  4. Para eso utilizaremos el .then(func), que ejecutar谩 el c贸digo de la funci贸n que le demos (en este caso, func), pas谩ndole la respuesta del servidor como par谩metro.
  5. El .then suele ir por debajo de la funci贸n que hayamos llamado (fetch en este caso) e indentado, por pura est茅tica nada m谩s. N贸tese que se puede hacer fetch(url).then(func) sin dejar ning煤n espacio.

As铆, un ejemplo de c贸digo podr铆a ser:

function decirHola(res) {
	if (res.ok) {
		console.log("隆Todo bien!");
	}
}

fetch("https://google.com")
	.then(decirHola)

Este c贸digo enviar铆a un request a https://google.com y, una vez tuviera una respuesta del servidor, har铆a decirHola(respuesta), siendo respuesta la respuesta que haya dado el servidor de esa URL.

Lo que pasa es que muchas veces la funci贸n que usamos (en este caso decirHola) no se define aparte, sino que se crea al instante. Este concepto es conocido como funci贸n an贸nima y se ve as铆:

fetch("https://google.com")
	.then(function(res) { // abrimos la funci贸n an贸nima
		// aqu铆 el c贸digo de la funci贸n
		if (res.ok) {
			console.log("隆Todo bien!");
		}
	}) // el corchete cierra la funci贸n, el par茅ntesis cierra al .then

Este concepto es oro en polvo, son las promesas de JavaScript, as铆 que les invito a investigar sobre ello.

yo no habia entendido para nada la clase, me apoye de un video que vi en youtube: https://www.youtube.com/watch?v=BhvLIzVL8_o, esto para entender node y ademas, https://www.youtube.com/watch?v=pHBmmbDQl0o&t=2s, este otro video para entender como funciona una promesa, vale la pena.

No olviden que el objeto 鈥淐lass Jugador鈥 se escribe con la J may煤scula, por ese error no pude avanzar y perd铆 tiempo, un saludo, espero les sirva.

Wooooooooooooooowww!!! Me toy enamorando :3

Estoy viendo que ya vamos por la clase 76, a este punto muchas personas de las que comenzaron, no llegan, se dan cuenta que tal vez no es lo de ellos o x razones. pero aprovecho para felicitarnos por haber llegado a este punto y yo solo digo鈥 "no te acabes cursoooo!!! " jajajaja

cuando est茅n en la parte de poner ${Math.random} aseg煤rense que son las comillas EXACTAS que son estas: ``
se las dejo para que las copien o si no con el comando Ctrl + alt + (la tecla que tenga la comilla), ya que yo estuve como media hora para encontrar el error y eran esas comillas xd

La verdad uno queda loco鈥
El asunto radica en que no se nos explica realmente la finalidad de lo que hacemos, muestran todo el procedimiento pero hasta ahi.

si empezaran por mostrar que es lo que se busca con los que haremos quiza uno tendria mejor asociaci贸n con los conceptos

Si no os sale el console.log() en la pagina del html aseguraos que cuando llam谩is la funci贸n unirseAlJuego() teng谩is puestos los par茅ntesis ()

Que tengan un buen d铆a 馃巿

Me paso que habia cerrado todo al terminar la clase pasada, al abrirlo de nuevo quice seguir con el contro + c del sgundo 50 y continuar a la par, no lo logre por que debia ubicarme de nuevo en la carpeta donde tengo mis archivos, tal cual como el inicio del video pasado, dejo el aportesito por si a alguien mas le pasa, casi no doy con el chiste

Les quiero contar que hab铆a dejado el curso parado y lo he retomado 2 meses despu茅s. Es todo un reto retomar pero aqu铆 estoy, necesito terminarlo para poder continuar. Este curso se llama b谩sico pero se que tiene cosas muy avanzadas que seguramente vamos a ver m谩s adelante con mayor detenimiento.

Para posibles futuros errores:
Acordaros de tener el servidor funcionando. Si no lo est谩, os dar谩 error y no os dar谩 el n煤mero de jugador. (30鈥 intentando ver porque no me sal铆a)

No sab铆a que el res.text y res.json tambi茅n eran promesas, lol

me quedo con frontend !!!

Yo dandome cuenta que aun est谩 ah铆 el typo del profe Diego, bueno creo que el fue, que coloc贸 Mokepono, en lugar de Mokepon.

Por si no saben sacar (``) o no lo encuentran鈥 Pueden usar Alt + 96 y ah铆 les saldr谩 las comillas 馃槂

茅ramos cientos todos animados :C, quedamos pocos

Me pregunto . que tiene de basico la ense帽anza de back end que nos estan dando ? 鈥 jaja yo esperaba explicaciones y ense帽anzas basicas , pensando en alguien que de verdad esta partiendo en esto , no creo que esta parte de la ense帽anza este pensado en gente que recien comienza . 馃槮 la verdad desmotiva un poco que se salten tantos conceptos y que den por hecho que los dominaramos , si veo mucha gente comentando con conocimientos previos pero para alguien que recien parte en la programacion esto es mas desmotivante que motivante en si , por que va todo rapido y con apenas explicacion como si ya los de conocimiento basico lo supieramos , esperaba que aqui es cuando nos explican conceptos basicos o usos de los comandos en forma basica , no por que no quiera avanzar sino que por que primero pensaba que seteariamos las bases , pero veo que todo ya se da por hecho . Frustracion y estar perdido es poco! bueno como sea como dijo alguien por ahi!! vamos que queda poco!! por algo llegamos hasta aqui , solo que aburre un poco y cansa hacer todo copy paste sin entender mucho ni recibir explicaciones contextuales 馃し

Con async y await queda mas legible el c贸digo

const unriseAlJuego = async () => {
  let response = await fetch(http://localhost)
  let userData = await response.json();

  console.log(userData)
}

sin embargo es bueno saber como funciona una petici贸n con .then 鉁岋笍

Si no les carga la p谩gina de localhost deben poner esto en la consola: node index.js

Cr茅ditos a @ric.arellano92!!!
Para evitar el error 鈥渕okepon.js:448 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 鈥榥ombre鈥)鈥 lo que hice fue agregar un if que evalu茅 si el mokepon existe o no, esta validaci贸n tambi茅n se aplica en la parte de pintar mokeponEnemigo:

//____---------------------Al recuperar enemigos--------------------------
                mokeponesEnemigos = enemigos.map(function (enemigo)
                {
                    let mokeponEnmigo = null
                    if(enemigo.mokepon != undefined)
                    {
                        const mokeponNombre = enemigo.mokepon.nombre 
                        switch (mokeponNombre)
                        {
                        case "Hipodoge":
                            mokeponEnmigo = newMokepon('Hipodoge', './assets/mokepons_mokepon_hipodoge_attack.png', 5, './assets/hipodoge.png', enemigo.id)
                                break
                            case "Capipepo":
                                mokeponEnmigo = newMokepon('Capipepo', './assets/mokepons_mokepon_capipepo_attack.png', 5, './assets/capipepo.png', enemigo.id)
                                break
                            case "Ratigueya":
                                mokeponEnmigo = newMokepon('Ratigueya', './assets/mokepons_mokepon_ratigueya_attack.png', 5, './assets/ratigueya.png', enemigo.id)
                                break
                            default:
                                break
                        }

                        mokeponEnmigo.x = enemigo.x
                        mokeponEnmigo.y = enemigo.y
                    }
                        return mokeponEnmigo
                })

//---------------------------------Al tratar de pintar enemigos----------------------------------------
        mokeponesEnemigos.forEach(function (mokepon)
        {
            if(mokepon != undefined){
                mokepon.pintarMokepon()
                revisarColision(mokepon)
            }
        })

Re sub铆 la respuesta de @ric.arellano92 porque estuve rompi茅ndome la cabeza durante una semana y quiero que otros lo puedan solucionar, ya que desde las carpetas del curso da error.

Gracias a los dioses del internet que dejamos CSS atr谩s y nos pusimos serios馃槏

La prf me parece muy buena y se nota que est谩 muy clara en lo que habla, pero, su clase la da (a mi parecer), tipo repaso, ignorando que muchos aca no estamos tan empapados en el tema que imparte鈥 Estaria genial que se tome un poco mas de tiempo y explicar el paso a paso de lo que hace鈥

Buenas noches, tengo un problema cuando trato de hacer el localhost:8080/inirse en el navegador me sale unas lineas y me dice que hay una referencia de erro ya compare mi codigo y creo tenerlo bien. si alguien lo puede revisar y me decir cual es el erro.

<code> const express = require("express")

const app = express()

const Jugadores = []

class Jugador {
    constructor (id) {
        this.id = id
    }
}

app.get("/unirse", (req, res) => {
    const id = `${Math.random()}`

    const Jugador = new Jugador(id)
    Jugadores.push(Jugador)

    res.send(id)
})

app.listen(8080, () => {
    console.log("servidor funcionando")
})

Dos cosas:

  1. En recursos de la clase esta la soluci贸n del CORS.
  2. Como ya trabajamos en el servidor hay que tener todos los archivos dentro de la carpeta que se instal贸 el servidor.

Me salia error y tenia el servidor apagado jajajajjajaj

cuando inicio el local host me sale Cannot GET /unirse

Funcionando鉁

si no les sale el local host cambien las comillas dobles ("") por comillas simples(鈥 鈥)
ejemplo =>
app.get(鈥/unirse鈥, (req, res) => {
const id = ${Math.random()}
const jugador = new Jugador(id)
jugadores.push(jugador)

recuerden siempre checar que est茅n en la carpeta correcta.

Esto es incre铆ble.

extra帽amente como es la tecnologia muchas veces ,no me cargaba el numero aleatorio que sesupone que tiene que arrojar cuando vamos al server en 鈥渉tt://localhost:8080/unirse鈥 鈥tonces lo que hice es apagar la terminal con 鈥淐trl +C鈥 y luego la encendi con 鈥渘ode index.js鈥 luego fui a cargar nuevamente en 鈥渉tt://localhost:8080/unirse鈥 y ahi si me arrojo el numero aleatorio , la tecnologia y el resetear jaja nunca falla 鈥n clasico!

vengo a dar mi aporte.

Yo tenia el error Access-Control-Allow-Origin pero ya tenia la clase en curso, la repase varias veces, descrague el codigo lo compare con vs todo estaba bien y me salia el mismo error, y en el mokepon de la clase que descargue tambien tenia el mismo error.

A prueba y error y gracias a el comentario en la comunidad dev de discord de platzi, instale la extension live-server en vs y bualaaaaa

Funciona.
Ahora me pregunto que pasoo y como sirve esto.
si algun profe lee este comentario o estudiante que sepa, le agradezco la aclaracion.

Antes de poder recibir una respuesta de nuestro servidor, primero se debe verificar si esta permitido llamar al servicio desde este origen (nuestro frontend) y para eso revisaremos que nos pasa como parametro la variable res en la consola, de esta denegarse por un error seria momento de crear una cabecera desde nuestro backend para permitirnos utilizar servicios desde este origen

localhost --> servidor local

get --> permite solicitar recursos

post --> permite enviar datos

.then --> recibe una funcion

res.setheader() --> permite que se realicen solicitudes desde el lugar especificado

fetch --> permite acceder y manipular solicitudes

Me cuesta seguirle el ritmo a la profesora. Debe ser porque backend no es lo m铆o 馃槮

recuerden poner el Math.random de manera correcta 鈥 Math.random()

Me encanta la manera de explicar de la profe Diana Martinez. Bastante clara la informacion que es bastante compleja! Felicidades 馃槃

La funci贸n fetch() en JavaScript puede recibir uno o dos par谩metros:
.
1 - La URL de la solicitud: Este es el 煤nico par谩metro obligatorio que se debe proporcionar a la funci贸n fetch(). Representa la direcci贸n web de la cual se espera obtener una respuesta.
.
2 - Las opciones de configuraci贸n: Este es un par谩metro opcional que se utiliza para proporcionar configuraciones adicionales para la solicitud. Este par谩metro es un objeto que puede tener los siguientes atributos:
.

  • method: El m茅todo HTTP de la solicitud, como GET, POST, PUT, DELETE, etc.
    .
  • headers: Los encabezados HTTP de la solicitud, como 鈥淐ontent-Type鈥 y 鈥淎uthorization鈥. Este es un objeto con pares clave-valor.
    .
  • body: El cuerpo de la solicitud, como una cadena de texto, un objeto FormData, un objeto Blob, un objeto BufferSource, o un objeto URLSearchParams, entre otros.
    .
  • mode: El modo de la solicitud, como 鈥渃ors鈥, 鈥渟ame-origin鈥, o 鈥渘o-cors鈥.
    .
  • cache: El modo de cach茅 de la solicitud, como 鈥渄efault鈥, 鈥渘o-store鈥, 鈥渞eload鈥, o 鈥渘o-cache鈥.
    .
  • redirect: El modo de redireccionamiento de la solicitud, como 鈥渇ollow鈥, 鈥渆rror鈥, o 鈥渕anual鈥.
    .
  • referrer: El valor del encabezado Referer de la solicitud.
    .
  • referrerPolicy: La pol铆tica de referer de la solicitud, como 鈥渘o-referrer鈥, 鈥渘o-referrer-when-downgrade鈥, o 鈥渙rigin鈥.
    .
  • integrity: El valor de integridad de la solicitud, como un hash criptogr谩fico.

.
En resumen, fetch() puede recibir la URL de la solicitud como 煤nico par谩metro obligatorio, pero tambi茅n puede recibir un objeto con opciones de configuraci贸n adicionales para personalizar la solicitud y la respuesta.

Si quieren entender mas acerca de este tema de las** Promesas en JS** recomiendo mucho este video https://www.youtube.com/watch?v=ppzrpTjwEC8&ab_channel=jonmircha . En este canal tambien podran encontrar muchos otros videos de varios temas de Javascript para reforzar.

De esta forma improvise los id para que fusen enteros de diez (10) d铆gitos:

${1234567890 + Math.floor(Math.random() * 9876543210)}`;

Solo es una forma pr谩ctica con el mismo generador aleatorio de n煤meros entre dos cantidades.

Que increible, me estoy enamorando mas y mas de la ptogramacion

Me parecio increible el como se utiliza un API Rest en un FrontEnd como JS, me quede impresionado. Y la forma que se declara para obtener el resultado de su funcionamiento. Espero seguir aprendiendo mas.

creditos a :Chema Ferr谩ndez

Para posibles futuros errores:
Acordaros de tener el servidor funcionando. Si no lo est谩, os dar谩 error y no os dar谩 el n煤mero de jugador. (30鈥 intentando ver porque no me sal铆a)

Se puso bastante complejo el curso ajajajaj

Para sacar el 鈥渃onsole.log鈥 de manera r谩pida, solo escriban 鈥渓og鈥 se van a la segunda opcion del vscode y le dan a enter o tabulan

Al principio no me tomada el ID aleatorio y salia error, lo corregi pero aun asi salia el mismo error, luego reinicie el servidor y ahi si funciono correctamente por si les pasa a ustedes

as铆ncrona : quiere decir que no sabemos cuanto tardar en darnos la respuesta el servidor por eso es as铆ncrona.

Simplificando

  • fetch(url); realiza por defecto una solicitud tipo GET.
  • La solicitud es as铆ncrona, por lo que se utiliza .then para esperarla.
  • then no recibe el texto que queremos, recibe un objeto.
  • Objeto al que podemos manipular para sacarle la info:
  fetch("url")
  	.then(objeto => objeto.text())
  	.then(respuesta => console.log(respuesta))
  • objeto contiene la respuesta de la solicitud get (que es el objeto Response).
  • objeto => objeto.text() (En objeto (Response) extraer lo que contenga)
  • respuesta => console.log(respuesta) (almacenar lo extra铆do en respusta y muestralo en la consola)

puenden instalarse :

npm i nodemon

para no tener que sacar y volver a inciar el servidor en cada cambio.

para usarlo solo tienen que escribir nodemo index.js dentro de la carpeta donde esta index.js

Para detener el Servidor Crtl + C鈥

media hora viendo que significa 鈥榝unction random() { [native code] }鈥 para darme centa que no le coloque los parentesis a Math.random 馃槀

estoy muy trabada , se rompio mi juego , no se porque , aparecieron varios archivos mokepon html en mu cpu , desde q estoy utilizando la terminal y ahora es como que toma un codigo que esta incompleto y no funciona el juego

Siento ya que llevo el apellido 鈥淏ack End鈥, tal como la Von Der Layen o mejor dicho la Von Der Guerris

Hola me aparece este error, pero no logro identificar la soluci贸n.!

Si a alguno le ocurre como a m铆 que no puede apagar el servidor usen este comendo en la consola:

killall node

todo perfecto pero me cuesta seguirle el codigo a la profe! xq tiene abierta la terminal y casi no se ve! de resto todo OK

Esto esta muy divertido 馃槄