Conectar el front-end con el back-end requiere algo más que generar IDs: necesitas enviar y recibir datos reales. Aquí aprendes a usar objetos JSON, peticiones POST y la librería CORS en Express para que cada jugador seleccione su Mokepon y lo comunique al servidor en tiempo real.
Esta guía te sirve si ya tienes un endpoint GET funcionando y quieres dar el siguiente paso: enviar información estructurada desde el cliente, procesarla en el servidor y asignarla a un objeto dentro de tu lógica de juego.
¿Qué es JSON y por qué lo usamos para comunicar APIs?
JSON es la forma estándar de mover datos entre cliente y servidor cuando trabajas con ExpressJS [01:21].
JSON significa JavaScript Object Notation y funciona como una caja que transporta información entre el front-end y el back-end. A diferencia de las clases, no defines primero la estructura y luego los datos: lo haces todo al mismo tiempo.
La sintaxis se basa en pares clave-valor encerrados entre llaves. La clave es un nombre válido como variable y el valor puede ser una cadena, un número u otro tipo de dato. Cada par se separa con coma.
¿Cómo se ve un objeto JSON básico? Algo así: { nombre: "Diana", edad: 27 }. La clave va a la izquierda, el valor a la derecha y los dos puntos los separan.
¿Qué datos viajan en el paquete JSON del juego?
El jugador envía dos cosas al servidor cuando selecciona su Mokepon:
El ID del jugador que está enviando la selección.
El nombre del Mokepon elegido.
Con eso el servidor anota la selección en la lista y los demás jugadores podrán verla.
¿Cómo configurar CORS y JSON en Express sin errores?
Antes de crear el endpoint, hay que resolver dos cosas en el servidor para evitar errores de origen cruzado y permitir recibir cuerpos JSON [04:30].
Instala la librería con npm install cors, impórtala con const cors = require('cors') y úsala con app.use(cors()). Esto reemplaza la configuración manual de headers y deja todo listo de forma transparente.
Después habilita la lectura de JSON en el cuerpo de las peticiones con app.use(express.json()). Sin esta línea, las peticiones POST no podrán leer la información que envías desde el cliente.
¿Cómo crear un endpoint POST que reciba el Mokepon seleccionado?
El segundo servicio del juego usa el método POST porque recibe datos, no solo los entrega [06:15].
La ruta es /mokepon/:jugadorId. Los dos puntos antes de jugadorId definen un parámetro de URL en Express, lo que permite saber qué jugador está enviando la selección.
Del lado del servidor extraes el ID desde req.params y el nombre del Mokepon desde req.body. Si alguno no llega, asignas una cadena vacía como respaldo. Cierras la respuesta con res.end() para que el navegador no quede esperando.
¿Cómo enviar la petición POST desde el front-end con fetch?
Por defecto, fetch hace peticiones GET. Para convertirla en POST necesitas un segundo argumento con la configuración [12:40].
El header content-type con valor application/json le dice al servidor qué tipo de dato recibe.
El body se transforma con JSON.stringify() porque fetch exige que el cuerpo sea una cadena de texto.
¿Por qué uso JSON.stringify en el body? Porque fetch no acepta objetos directamente como cuerpo. Convertir el JSON a string permite que viaje por la red y el servidor lo reconstruya gracias a express.json().
La URL usa template strings con comilla invertida y ${jugadorId} para insertar el ID del jugador de forma dinámica. Esa variable se declara como let jugadorId = null al inicio y se actualiza con la respuesta del endpoint de unirse a la partida.
¿Cómo asignar el Mokepon al jugador correcto en el back-end?
El servidor necesita encontrar al jugador dentro de la lista y asignarle el Mokepon que acaba de elegir [16:50].
Primero creas la clase Mokepon con un constructor que recibe el nombre y luego agregas un método asignarMokepon(mokepon) dentro de la clase Jugador que guarda la referencia con this.mokepon = mokepon.
javascript
class Mokepon {
constructor(nombre) {
this.nombre = nombre
}
}
Para localizar al jugador usas findIndex, un método de los arreglos que devuelve la posición del elemento que cumpla una condición. Si lo encuentra, regresa el índice; si no, devuelve -1.
La validación if (jugadorIndex >= 0) evita que intentes asignar un Mokepon a un jugador que no existe. Cuando el índice es válido, accedes al elemento con jugadores[jugadorIndex] y llamas a asignarMokepon(mokepon).
¿Qué hace findIndex en JavaScript? Recorre el arreglo, evalúa una condición en cada elemento y retorna el índice del primer match. Si nada coincide, devuelve -1, lo que sirve como señal de que no existe.
Al probarlo, los console.log muestran al jugador con su ID, su tipo de objeto y el Mokepon asignado con el nombre correcto, por ejemplo Ratihuella o Capipepo. Con eso confirmas que la cadena completa funciona: selección en el front, envío por POST, recepción en Express y asignación al objeto en memoria.
¿Cómo te imaginas extender este flujo para sincronizar las coordenadas del mapa entre todos los jugadores? Cuéntalo en los comentarios.
Esta genial tu ejemplo,creo que con este tipo de ejemplos tan graficos me ayuda a enteder mas esto del backend.
amigo como se realizan ese tipo de imagenes?
Ya es esta parte se pone un poco complicado para mi. literal estoy tecleando el codigo pero estoy entendiendo un 20%, espero mas adelante pueda entender ( creo que me gusta mucho el tema grafico)
A mi me sirve intentar explicarle estos conceptos a mi esposa, no sabe nada de programacion, pero contandole me doy cuenta de lo que no estoy entendiendo y luego voy y busco mas informacion aparte de platzi(videos en youtube y documentacion y otros ejemplos)
@alluringkiko1 Si yo aveces tambien lo aplico, pero esto del backend me ha dado duro entonces no se como explicarlo.
Yo les recomiendo ver todas las clases de Diana de chorro (asi no se entiendan muchas cosas), pero esto sirve para darnos la idea general de que es lo que se está haciendo. Y despues, si ver cada clase con detenimiento, tomando nota e investigando sobre lo que uno no entiende. A mi me sirve asi porque al principio uno sigue los pasos, pero no se entiende para donde va. Despues de que vi los videos y entendi cual era la dinamica del juego online que estamos haciendo, fue mas facil volver a ver los videos. y entender cada paso que se está haciendo
Es una buena opción, gracias por la técnica!
Buena idea, te haces un marco y luego lo rellenas. Bravo !
parece mentira pero tenia horas en un error y viendo línea por línea, me fije que había escrito mal esto
fetch(`http://localhost:8080/mokepon/${jugadorId}`,{method:"post",headers:{/* habia escrito application con una sola p */"Content-Type":"application/json"},body:JSON.stringify({mokepon: mascotaJugador
})});
Me ha pasado con las llaves de }... 😒 pero ahí poco a poco
Eres el mejor 👌 llevaba rato con el problema de que no me aparecía el nombre del mokepon y era por esto mismo, muchas gracias
Ok entendí todo el curso pero ya estas ultimas 3 clases es como hablar en otro idioma jajajaja
Asi me siento yo, pero me siento emocionado al aprender algo nuevo.
Siento satifaccion cuando luego de analizar todo el contenido por lo menos le tomo el hilo del contendo que me intentan enseñar. XD
Yo igual jaja ánimo.
Detalle:
El JSON esta muy bien explicado por la profe, pero en la imagen que lo explica se muestran un objeto de JavaScript.
En el JSON tanto la clave como el valor va entre "comillas". ej: { "clave": "valor" }
Buen detalle.
buenisimo gracias
A veces con cada clase me siento derrotado:
Pero luego veo que estoy ya casi por terminar el curso y me ánimo a darle con fuerza:
jejeje ---SIII
He llegado un punto en donde es demasiado complicado y como dicen muchos de mis companieros solo le estoy entendiendo lo minimo, cada clase la veo 4 veces, primero la veo sin pausas pra tratar de entender que es lo que sucede, luego repito la clase para escribir el codigo junto con la profe, luego de que haya escrito todo, vuelvo a ver toda la clase para tratar de entender un poco mas y por ultimo me descargo todas las clases para verlas en mis tiempos libres y aun asi se me hace un poco complicado pero no desisto y y sigo echandole muchas ganas se que al final todo esfuerzo tendra su recompensa...
Animo!!!
No tienes que entenderlo todo punto a punto, solo encierra los códigos en compartimentos, así será durante toda la vida de programador, luego iras desmenuzando el código y todo tendrá sentido.
I didn't understand anything, but I never stop learning.
Ánimo.
no te rindas sigue asi!!
Uff lo vi muchas veces, y ya entendí casi todo de esta clase
Me alegro mucho!!! Así es como se aprende!
Genial!
El profe explica muy bien, pero como novato aun no le entiendo ni papa jejeje. Pero toca seguir.
Soy nuevo en esto y "descubrí" algo que para mi fue muy interesante y es:
El servidor nos da un id desde que entramos a la página: lo da en orden de entrada. Hice la prueba iniciando desde tres ventanas diferentes a mi juego y a cada una le dio un id y el orden en que los registraba era el mismo orden en que ingresaron al juego.
Es como si estuvieras entrando a un salon y te dieran un numero o una posición acorde al orden de llegada.
-Luego seleccione personaje desde la última pestaña en que ingrese [tenía el índice 2 del array de jugadores ya que fue la tercera pestaña que ingresó al juego] y "magicamente" se actualizo el array y su tercer elemento[2] ahora tenía el nombre del personaje que elegí en su propiedad nombre.
Se que para quienes ya saben como funciona es normal pero para mi fue mágico hahaha, aun no entiendo bien cómo sucede todo pero espero entender mejor luego.
Dejo por aquí la respuesta en consola para que se entienda mejor lo que explique arriba.
Me has compartido tu misma emoción. xD
Les dejo una muy buena explicación de lo que es un JSON
gracias!!
Creo que sería buena idea implementar un glosario o similar de las palabras claves de cada clase.
Ej: Callback, fetch, .then
Aclaro que las clases están claritas como el agua, lo único que tuve que buscar es: "qué era el callback?"
Servidor se apaga con Ctrl + C y se prende con: node index.js
NO OLVIDAR GUARDAR PRIMERO!!!
Segun mi experiencia, a veces se abren varias terminales, mejor siempre cerrar todas y abrir solo una.
yo la primera vez no lo hice, despues la terminal me impedia escribir . Vi denuevo y supe que se tenia que poner ctrl c.
BUEN DETALLE
es mi primera vez conociendo back end y json, no sabia absolutamente nada, me duele el cerebro xd pero es interesante.
Aprendi una leccion muy valiosa, entre Headers y headers, por tener la h mayuscula no me traia el mokepon y yo mirando todo hasta que volvi a revisar toda la clase !!! gracias profe !!
me pasó exactamente lo mismo jaja
pues ahora somos 3, llevo 3 horas buscando ese mismo error jajajajaja
Bueno.... me funciono la mitad hahahha, aqui es donde tal vez no fue la mejor idea haber hecho las cosas a mi manera en el frontend porque ahora cuando ellos se refieren a cosas en frontend yo tengo otros nombres y me es muy fácil perderme... pero nada que no se solucione revisando todo nuevamente
Ya me di cuenta de que me fallo Xd.. resulta que en el if donde validamos que coincida algún jugador de nuestra lista con el id del jugador request me falto ponerle el = junto al > 0.
if(jugadorIndex >=0){}//Yo había escrito > 0 de esa manera no estaría teniendo en cuenta nuestra posición 0 del array
que bueno que lo pudiste solucionar
Por si a alguien le sirve, a mi me salía este error :
y se debía a que en el código del backend había puesto un coma por error (tarde horas comprobando el código)
llevo una hora y me paso algo similar, muchas gracias bro de no ser por ti casi me pego un tiro jaja
a mi me pasa eso mucho antes jajaja de tener eso escrito! y verifique y todo esta igual que la profe :S
Amigos me ocurrió que al final para hacer la prueba me arrojaba un problema con la dichosa leyenda de "Access-Controll..." y no ecnontraba el por que si ya habia importado CORS a lo cual despues tuve que ver el video varias veces buscando si no habia escrito algo mal cuando solo era borrar esa linea de código. Les comparto mi experiencia por si le pasa jaja.