// Reto solucionado app.get("/movies", (req, res) => { const genre = req.query.genre; let page = parseInt(req.query.page) || 1 let size = parseInt(req.query.size) || 3 if (page < 0 ) page = 1 if (size < 0 ) size = 3 let moviesQuery = movies if (genre) { const moviesByGenre = movies.filter((movie) => movie.genre.some((g) => g.toLowerCase() === genre.toLowerCase()) ); moviesQuery = moviesByGenre if (moviesByGenre.length === 0) { return res.status(404).json({ message: `Genre ${genre} not found` }); } } const totalElements = moviesQuery.length const totalPages = Math.ceil(totalElements / size) const start = (page - 1) * size const end = start + size const dataMovies = moviesQuery.slice(start, end) res.json({ page: page, size: size, total_elements: totalElements, total_pages: totalPages, data: dataMovies }) }); // GET localhost:5439/movies?genre=Drama&page=2&size=3 // - Si el usuario filtra por genero y dicho genero no devuelve info manda error 404 // - Por default las query de obtener las peliculas van a estar paginadas con un tamaño de 3 elementos y empiezan en la pagina 1, que se puede modificar con la query // - El usuario va poder ingresar numeros negativos en las paginas o tamaño pero estas pero devolverán pagina 1 o tamaño 3, en los positivos no lo hice asi ya que si quiere acceder a la pagina 2000 y no hay info pues vera que no hay info en vez de alterar su numero // Pd: Gracias midu muy buen curso y explicaciones 10 / 10
Soy desarrollador de hace 3 años. A pesar de tener experiencia tus explicaciones y dedicación es alimento para refrescar y alimentar mis conocimientos. Te admiro y te agradezco por tu esfuerzo!
WoW midu, la verdad es que tu contenido es de lo mejor que hay, muy denso para un principiante pero explicado de forma ordenada y de poco a poco, para así tener unas buenas bases a partir de las cuales seguir por ti mismo, es impresionante cómo con 1h y 30 min de video he tardado como 3h enteras para completarlo porque estaba cogiendo apuntes y preguntándole dudas a ChatGPT, pero creo que al final lo tengo todo claro, llevo 3 videos y ya se siente como toda una asignatura de universidad, mi código tiene más apuntes que código jaja. Es de los mejores cursos de introducción que he visto, super completo para lo que suelen ser estos cursos y muy bien estructurado, si tus cursos de Platzi están igual de bien, creo que terminaré pasando por caja.
midu sos un crack, quiero destacar lo importante que es para mi ( y para muchos más) que hayas sido tan meticuloso hasta con la división de las secciones por temas en las clases de youtube que sirven un montón para guiarse en tanto contenido, gracias x tanta calidad, se te quiere midu
Me encantan tus videos, los veo como una película, estoy aprendiendo, y es emocionante, como cuando aprendí a programar por primera vez y cada cosa era nueva y me abría las oportunidades, así me siento aprendiendo viendo tus videos, es como que todo es una masa gris de cero conocimiento y no sé ni siquiera cómo buscar tutoriales de lo que quiero hacer porque no sé cómo funciona por detras, pero ver tus videos es como apuntar una potente linterna a la oscuridad y tener claro el camino.
Midu eres uno de mis padres en este mundo, gracias por estos videos y siempre hablar con conceptos técnicos para que podamos entender mejor como funciona algo. Sin duda aclare muchos conceptos que posiblemente usaba en código pero que no entendía del todo, un saludo desde Ecuador y gracias por este contenido.
Me ha gustado la explicacion de las monedas. Que grande Midu.!!! De forma sencilla nos da la enseñanza practica sin necesidad de recurrir a terminologia compleja de DDD (entities vs value objects)
gracias midu . me viene bien este video , estoy intentando hacer un ToDoList con bases login para diferentes usuarios y este video esta super por el tema de los cors . graciaaas
Excelente explicación Midu! Me queda una duda... cual es el objetivo del CORS ? Porque estaba pensandolo por el lado de la seguridad pero cualquiera con la URL de la API podría acceder y leer la respuesta ignorando los headers.
genial clase de node y de cors! mejor entendido que nunca! :D como siempre... muchas gracias por enseñarnos y por ser como eres que hace que aprendamos con una sonrisa en la boca :)
excelente explicacion, ahora una pregunta para protgher las rutas cual es el mejor metodo? en mi caso tengo varias fetch desde un un .js del html? ya que no me gustaria pasar el token de jwt por cookies, localstorage o session por que queda expuesto.
Increible tu aporte como siempre Midu! . Consulta por si alguien sabe, es igual importar randomUUID de esta manera? const { randomUUID } = require('crypto') ?
Midu , para la validacion de los datos que venian en la request era viable usar Express-validator? como un middlware ? Me quedé con esa duda , un saludo!
Aún no veo todo el video, que está muy bueno y bien explicado como siempre, pero quería hacer una corrección: la pronunciación de middleware podría ser midelwer o midlwer, pero nunca MAIdelwer. Con cariño💙
Primero andate a la documentacion y copia el codigo aus salga, mira los errores copialos y pegalos. Si el ejemplo de la docu es muy complicado busca un video mas cortito max 20 mins de lo que quieras aprender y solo mira lo que te interese
no entiendo porque en el ejemplo que hizo del método DELETE, él si puede recuperar el nombre del origen distinto y yo no puedo, estoy que hago los mismo, pero no me recupera el nombre del origen req.header('origin'); solo en el método get me devuelve el nombre del origen distinto
en la configuracion de cors, cuando usa mi backend a produccion, en la lista tambien tendre que poner mi url de mi backend de produccion ? o no haria falta.
no se si tengo algo mal, creo q no pero en lugar de 200 me sale en movies un 301 y remote address [::1]8080 en lugar de 1234. Le ha pasado al alguien mas? Solucion?
Hola a todos los devs, una pregunta pls, qué hace exactamente esta verificación? (parte de PATCH) app.patch('/movies/:id', (req, res) => { const result = validatePartialMovie(req.body) if(!result.success){ return res.status(404).json({ error: JSON.parse(result.error.message)}) //
Hola, disculpa, esta es la solución, cuando nosotros hacemos la API, pero que pasa cuando estoy consumiendo un API de una empresa privada y no puedo decirle al API que origen aceptar, como puedo consumir esa API
a que se deberá este error "TypeError: keyValidator._parse is not a function", me sale en el archivo movies.js en esta linea: return movieSchema.safeParse(object), he revisado el codigo una y otra vez y esta igual como lo hace midulive,
El POST me agrega solamente el id y el rate, pero no me agrega las otras propiedades de la request y me dice que son undefined, escribi todo igual que en el video.
mira que como por una hora que intente llegue lo resolvi: y es que a midu le falto crear el metodo de eliminar : app.delete('/movies/:id', (req, res) => { const origin = req.header('origin'); if (ACCEPTED_ORIGINS.includes(origin) && origin) { console.log('origin'); // cors res.header('Access-Control-Allow-Origin', origin); } const { id } = req.params; const movieIndex = movies.findIndex(movie => movie.id === id); if (movieIndex === -1) { return res.status(404).json({ message: 'Movie not found' }); } movies.splice(movieIndex, 1); return res.json({ message: 'Movie deleted' }); });
y por eso es que te devolvia seguro un 404 y problema de cors. en teoria es crear el endpoint de eliminar y dentro incluir el cors para tu servidor web, espero hacerme explicar
Deberes/Tarea/Actividad:
* Hacer por paginación 27:12
No me salio el patch no se en que estoy mal
Pero espero subas el ejemplo en el repo
cuando utilizo /movies?page=n se rompe, me toma el movies/:id y me devuelve movie not found o.o
// Reto solucionado
app.get("/movies", (req, res) => {
const genre = req.query.genre;
let page = parseInt(req.query.page) || 1
let size = parseInt(req.query.size) || 3
if (page < 0 ) page = 1
if (size < 0 ) size = 3
let moviesQuery = movies
if (genre) {
const moviesByGenre = movies.filter((movie) =>
movie.genre.some((g) => g.toLowerCase() === genre.toLowerCase())
);
moviesQuery = moviesByGenre
if (moviesByGenre.length === 0) {
return res.status(404).json({ message: `Genre ${genre} not found` });
}
}
const totalElements = moviesQuery.length
const totalPages = Math.ceil(totalElements / size)
const start = (page - 1) * size
const end = start + size
const dataMovies = moviesQuery.slice(start, end)
res.json({
page: page,
size: size,
total_elements: totalElements,
total_pages: totalPages,
data: dataMovies
})
});
// GET localhost:5439/movies?genre=Drama&page=2&size=3
// - Si el usuario filtra por genero y dicho genero no devuelve info manda error 404
// - Por default las query de obtener las peliculas van a estar paginadas con un tamaño de 3 elementos y empiezan en la pagina 1, que se puede modificar con la query
// - El usuario va poder ingresar numeros negativos en las paginas o tamaño pero estas pero devolverán pagina 1 o tamaño 3, en los positivos no lo hice asi ya que si quiere acceder a la pagina 2000 y no hay info pues vera que no hay info en vez de alterar su numero
// Pd: Gracias midu muy buen curso y explicaciones 10 / 10
Soy desarrollador de hace 3 años. A pesar de tener experiencia tus explicaciones y dedicación es alimento para refrescar y alimentar mis conocimientos. Te admiro y te agradezco por tu esfuerzo!
¡Muchas gracias! 🤗
WoW midu, la verdad es que tu contenido es de lo mejor que hay, muy denso para un principiante pero explicado de forma ordenada y de poco a poco, para así tener unas buenas bases a partir de las cuales seguir por ti mismo, es impresionante cómo con 1h y 30 min de video he tardado como 3h enteras para completarlo porque estaba cogiendo apuntes y preguntándole dudas a ChatGPT, pero creo que al final lo tengo todo claro, llevo 3 videos y ya se siente como toda una asignatura de universidad, mi código tiene más apuntes que código jaja.
Es de los mejores cursos de introducción que he visto, super completo para lo que suelen ser estos cursos y muy bien estructurado, si tus cursos de Platzi están igual de bien, creo que terminaré pasando por caja.
Es increible el aporte de Midu a la comunidad hispana ❤❤❤
midu sos un crack, quiero destacar lo importante que es para mi ( y para muchos más) que hayas sido tan meticuloso hasta con la división de las secciones por temas en las clases de youtube que sirven un montón para guiarse en tanto contenido, gracias x tanta calidad, se te quiere midu
Me encantan tus videos, los veo como una película, estoy aprendiendo, y es emocionante, como cuando aprendí a programar por primera vez y cada cosa era nueva y me abría las oportunidades, así me siento aprendiendo viendo tus videos, es como que todo es una masa gris de cero conocimiento y no sé ni siquiera cómo buscar tutoriales de lo que quiero hacer porque no sé cómo funciona por detras, pero ver tus videos es como apuntar una potente linterna a la oscuridad y tener claro el camino.
MIDU, vengo siguendo la serie de node, eh echos otros de tus cursos y la verdad es que eres un crack tio, muchas gracias.
Clave la explicación de CORS! Haces que todo parezca facil!!!
gracias Midu 🧡
Midu eres uno de mis padres en este mundo, gracias por estos videos y siempre hablar con conceptos técnicos para que podamos entender mejor como funciona algo. Sin duda aclare muchos conceptos que posiblemente usaba en código pero que no entendía del todo, un saludo desde Ecuador y gracias por este contenido.
Gracias midu, vengo siguiendo este curso y lo que he aprendido con los dos videos anteriores es invaluable, saludos desde Costa Rica!!!
De nuevo, muchas gracias. Pocos saben compartir conocimiento, a ti se te da perfecto.
Muchas gracias MIDU, efectivamente la mejor explicación de CORS!!!
Me ha gustado la explicacion de las monedas. Que grande Midu.!!! De forma sencilla nos da la enseñanza practica sin necesidad de recurrir a terminologia compleja de DDD (entities vs value objects)
validar con zod me ayudo mucho, ahora puedo validar en diferentes proyectos de una manera muy sencilla, gracias Midu
Gracias al editor que grande eres 7:27 ♥️, y obvio gracias, gracias por el conocimiento ❤❤
Vengo siguiendo esta playlist de Node.js y es espectacular! Thank you Midu
Muchas gracias!
Te amo midu, la única solución explicada con el tema de la policía del CORS. Gracias.
gracias midu . me viene bien este video , estoy intentando hacer un ToDoList con bases login para diferentes usuarios y este video esta super por el tema de los cors . graciaaas
Me esta ayudando mucho gracias. solo der repente sentí que dio un acceleron a cosas que no sabia pero así se aprender.
ufff!! combino esto con lo que ya sabía y mi entendimiento se abre aún más, gracias
x2
Este men ya no es Senior sino Arquitecto
Muchisimas gracias... desde lo Alto las mas grandes bendiciones! Siempre entusiasmado por tus cursos! Saludos desde Costa Rica. Pura vida!
que bárbaro la mejor explicación de rest y cors muhcas gracias!!!!
Excelente todo y a destacar lo del pre-flight en los metodos complejos 😲
Bruno Díaz? 26:57 🤨 jajaja genial la clase y muchas gracias por compartir tu experiencia y conocimientos! Salu2 desde Perú!
Bruce Wayne aka Bruno Díaz y Dick Grayson aka Ricardo Tapia
Excelente explicación Midu!
Me queda una duda... cual es el objetivo del CORS ?
Porque estaba pensandolo por el lado de la seguridad pero cualquiera con la URL de la API podría acceder y leer la respuesta ignorando los headers.
Como siempre gracias Midu. Me queda mucho más claro lo de los Cors
genial clase de node y de cors! mejor entendido que nunca! :D como siempre... muchas gracias por enseñarnos y por ser como eres que hace que aprendamos con una sonrisa en la boca :)
Muy agradecido Midu, mucha sustancia traen todos los videos de este curso, trato de digerirlos!!
Pagando la entrada al 3 curso, muchas gracias
que chulada zod, no lo conocia, que crack midu gracias por el video
Tu contenido es fenomenal, gracias por este curso :)
Gracias a ti!
Que buen video 👍 y como es el caso en el que da error de cors desde una aplicación movil?
Te amo midu muchas gracias!
Gracias a ti!
Muy educativo, gracias!
eres el mejor 👌, por fin entendí los malditos cors
Muy buena la explicación de CORS, yo pensando que solo era por dominio.
Comparando los metodos con instrucciones SQL:
POST: Insert
PUT: Merge
PATCH: Update
excelente explicacion, ahora una pregunta para protgher las rutas cual es el mejor metodo? en mi caso tengo varias fetch desde un un .js del html? ya que no me gustaria pasar el token de jwt por cookies, localstorage o session por que queda expuesto.
Grande Midu! todavia voy por el 1er cap. volveré pronto
Gracias Midu!
Increible tu aporte como siempre Midu! . Consulta por si alguien sabe, es igual importar randomUUID de esta manera? const { randomUUID } = require('crypto') ?
Esto está como pan caliente!!!
Graciass miduuuu, en las siguientes clases nos explicarás como usar los workers threads de node y los chiles process? Un saludo :D
Midu , para la validacion de los datos que venian en la request era viable usar Express-validator? como un middlware ? Me quedé con esa duda , un saludo!
no mas problemas de CORS :)😍
super bien explicado el cors
te admiro... demasiado
Aún no veo todo el video, que está muy bueno y bien explicado como siempre, pero quería hacer una corrección: la pronunciación de middleware podría ser midelwer o midlwer, pero nunca MAIdelwer. Con cariño💙
Jajaja ya me lo han dicho tantas veces que parece que esquivo la pronunciación correcta
*_Cada vez que veo estos videos siento que no se nada_* 🥲
Primero andate a la documentacion y copia el codigo aus salga, mira los errores copialos y pegalos. Si el ejemplo de la docu es muy complicado busca un video mas cortito max 20 mins de lo que quieras aprender y solo mira lo que te interese
Hola Midu prodrias explicar la forma mas optima de ferch de datos de una base de datos en firebase? usando el SSR de next js 13.4? 😊
no entiendo porque en el ejemplo que hizo del método DELETE, él si puede recuperar el nombre del origen distinto y yo no puedo, estoy que hago los mismo, pero no me recupera el nombre del origen req.header('origin'); solo en el método get me devuelve el nombre del origen distinto
Grande el Editor poniendo a Porta XD
7:26
en la configuracion de cors, cuando usa mi backend a produccion, en la lista tambien tendre que poner mi url de mi backend de produccion ? o no haria falta.
Crack total !!!
Midu me gustaría que nos hablaras de Fastify :D :D Express meee...
Falta que uses multer para imagenes sobre todo
Buen video
Midu intentando que aprendamos de donde vienen las cosas. Yo cuando uso cors:
const cors = require('cors')
app.use(cors()) 😂😂😂
Ahora uno con buenas practicas.
Excelente midu!!
Una consulta, como es el tema del certificado del curso?, seguro lo explicaste pero no lo encuentro. Gracias!
Hola, por favor puedes subir los archivos de la clase 3 al repositorio, solo está el JSON. Gracias.
Midu diciendo que "...req.body: Eso no se hace nunca". Yo con uno de esos en la mochila.
tuttodev también entraría al controlador
no se si tengo algo mal, creo q no pero en lugar de 200 me sale en movies un 301 y remote address [::1]8080 en lugar de 1234. Le ha pasado al alguien mas? Solucion?
midu y tus lentes bro
Como hacer para cambiar el icono a una flecha bonita cuando pone esto: =>. Muchas gracias midu
cascadia code
Te amo
Hola a todos los devs, una pregunta pls, qué hace exactamente esta verificación? (parte de PATCH)
app.patch('/movies/:id', (req, res) => {
const result = validatePartialMovie(req.body)
if(!result.success){
return res.status(404).json({ error: JSON.parse(result.error.message)}) //
¿Cómo se podría sanitizar inputs con Zod?. Por ejemplo evitar que te metan alguna etiqueta html o un script en un campo.
Un saludo.
Hola, disculpa, esta es la solución, cuando nosotros hacemos la API, pero que pasa cuando estoy consumiendo un API de una empresa privada y no puedo decirle al API que origen aceptar, como puedo consumir esa API
Lo ideal es ver la documentación de la misma
Midu, como estas?. Me esta costando seguir cuando tengo algún error por que no esta actualizado el repo del curso...
También puedes ir al Discord de la comunidad para que te echen una mano: discord.gg/midudev
a que se deberá este error "TypeError: keyValidator._parse is not a function", me sale en el archivo movies.js en esta linea: return movieSchema.safeParse(object), he revisado el codigo una y otra vez y esta igual como lo hace midulive,
igual me pasó
El POST me agrega solamente el id y el rate, pero no me agrega las otras propiedades de la request y me dice que son undefined, escribi todo igual que en el video.
si, a mi me paso lo mismo, pero despues probe usando Thunder Client y se agrego correctamente!
como hace para escribir emojis poniendo :nombredelemoji ?
q hambre me da cuando dice 'se lo come con patatas' xdd
donde esta la opcion de unirme al canal?
El PU... CORS es un dolor de cabeza!!! XD
Por que no tengo el error CORS?
no me funciona el npx server ./web
la ruta fl0/pricing no existe
owo
Me quede trabado en el DELETE problema de variable
mira que como por una hora que intente llegue lo resolvi:
y es que a midu le falto crear el metodo de eliminar :
app.delete('/movies/:id', (req, res) => {
const origin = req.header('origin');
if (ACCEPTED_ORIGINS.includes(origin) && origin) {
console.log('origin');
// cors
res.header('Access-Control-Allow-Origin', origin);
}
const { id } = req.params;
const movieIndex = movies.findIndex(movie => movie.id === id);
if (movieIndex === -1) {
return res.status(404).json({ message: 'Movie not found' });
}
movies.splice(movieIndex, 1);
return res.json({ message: 'Movie deleted' });
});
y por eso es que te devolvia seguro un 404 y problema de cors.
en teoria es crear el endpoint de eliminar y dentro incluir el cors para tu servidor web, espero hacerme explicar
A alguno le funciona el crear la cuenta en FL0?
Fl0 ha cerrado 🥹
@@midulive Que triste🥲, pero gracias por la respuesta tendre que seguir con el curso de Node
horrible
Gracias Midu!