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:
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:
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 CORSconst 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.
fetch(url) hace un GET (una petición para obtener algo) a la URL que se le especifique
Esta función nos retornará algo (lo que sea que se haya definido en el código del servidor).
No podemos trabajar con lo que nos retorne directamente, ya que el servidor se tomará un tiempo en responder.
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.
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ónif (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.
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
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)
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 🤷
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…
Créditos a @ric.arellano92!!!
Para evitar el error “mokepon.js:448 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘nombre’)” 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:
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.
Sé que probablemente necesitaría el curso que tienen de backend en los recursos para entenderlo 100%, pero sí consigo seguir la clase y ya apenas quedan 6 vídeos para terminar este proyecto. 🫡 Estoy muy orgullosa de mí y de todos los que estamos llegando hasta aquí con nuestros mokepones.
Buen día, me salió el siguiente error en el localhost:
"ReferenceError: math is not defined
at C:\Users\Gato\Desktop\mokepon\index.js:15:16
at Layer.handle \[as handle\_request] (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\route.js:144:13)
at Route.dispatch (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\route.js:114:3)
at Layer.handle \[as handle\_request] (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\layer.js:95:5)
at C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\index.js:284:15
at Function.process\_params (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\index.js:346:12)
at next (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\index.js:280:10)
at expressInit (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\middleware\init.js:40:5)
at Layer.handle \[as handle\_request] (C:\Users\Gato\Desktop\mokepon\node\_modules\express\lib\router\layer.js:95:5)"
llevo como una semana intentando y nada que logro corregirlo, alguien sabría como hacerlo?
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.
Hola
¿Con qué comando de teclas puedo hacer que aparezca la línea en de la TERMINAL donde ubica mi archivo? Después de que pongo a funcionar el servidor, tengo que eliminar esa TERMINAL para que esa línea de código vuelva a aparecer.
La verdad no entendí mucho seguí todos los pasos pero al final me sale este error:
Error: Cannot find module 'D:\EDGAR\Curso Basico de Programacion\mokepon\index,js'
at Module.\_resolveFilename (node:internal/modules/cjs/loader:1144:15)
at Module.\_load (node:internal/modules/cjs/loader:985:27)
at Function.executeUserEntryPoint \[as runMain] (node:internal/modules/run\_main:135:12)
at node:internal/main/run\_main\_module:28:49 {
code: 'MODULE\_NOT\_FOUND',
requireStack: \[]
}
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)
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 “htt://localhost:8080/unirse” …etonces lo que hice es apagar la terminal con “Ctrl +C” y luego la encendi con “node index.js” luego fui a cargar nuevamente en “htt://localhost:8080/unirse” y ahi si me arrojo el numero aleatorio , la tecnologia y el resetear jaja nunca falla …un clasico!
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
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 “Content-Type” y “Authorization”. 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 “cors”, “same-origin”, o “no-cors”.
.
cache: El modo de caché de la solicitud, como “default”, “no-store”, “reload”, o “no-cache”.
.
redirect: El modo de redireccionamiento de la solicitud, como “follow”, “error”, o “manual”.
.
referrer: El valor del encabezado Referer de la solicitud.
.
referrerPolicy: La política de referer de la solicitud, como “no-referrer”, “no-referrer-when-downgrade”, o “origin”.
.
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.
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.
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)
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
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?