¿Qué son los parámetros de consulta y cómo se utilizan?
Los parámetros de consulta, también conocidos como Query Parameters, son elementos en las solicitudes HTTP que permiten filtrar, paginar y personalizar la información que un servidor devuelve a un cliente. Estos parámetros suelen acompañar los métodos GET y son opcionales, lo cual significa que no siempre están presentes en la URL, pero pueden ser añadidos según se necesiten.
En un contexto de aplicaciones web, los parámetros de consulta son muy útiles para:
Paginación: Permiten dividir el contenido en partes manejables, por ejemplo, utilizando limit y offset para determinar cuántos resultados mostrar y desde qué posición empezar.
Filtrado: Es posible especificar condiciones para mostrar sólo los elementos que cumplan con ciertos criterios, como productos de una marca específica.
¿Cómo recoger parámetros de consulta en una aplicación?
Para recoger estos parámetros en una aplicación, se accede a ellos a través del objeto de request. En el código, esto se hace usando req.query, lo que permite obtener los valores de limit y offset, por ejemplo. Si no se envían, el sistema puede implementar una lógica por defecto para manejar estos casos.
const express =require('express');const app =express();app.get('/users',(req, res)=>{const limit = req.query.limit;// Obtener el parámetro limitconst offset = req.query.offset;// Obtener el parámetro offsetif(limit && offset){// Realizar operación con limit y offset res.json({message:'Parámetros recibidos', limit, offset });}else{ res.send('No hay parámetros de paginación');}});app.listen(3000,()=>console.log('Servidor en el puerto 3000'));
¿Cómo generar datos falsos para pruebas con Faker?
Cuando se trabaja con pruebas, especialmente en e-commerce, a menudo es necesario poblar la base de datos con datos ficticios. Aquí es donde entra Faker.js, una librería que ayuda a generar datos falsos de manera rápida y efectiva.
¿Cómo instalar y utilizar Faker de manera segura?
Debido a problemas de seguridad con versiones anteriores, se recomienda usar la versión estable 5.5.3 o la librería mantenida por la comunidad desde el nuevo repositorio. Así es como puedes instalarla:
Una vez instalada la librería, puedes empezar a crear datos ficticios:
const faker =require('@faker-js/faker');// Crear un array de productos ficticioslet products =[];for(let i =0; i <100; i++){ products.push({name: faker.commerce.productName(),// Nombre del productoprice:parseFloat(faker.commerce.price()),// Precio del productoimage: faker.image.imageUrl()// URL de imagen});}console.log(products);
¿Cómo solucionar conflictos de rutas en Express?
Al crear rutas en Express, es común cometer errores al estructurar las rutas, lo que puede llevar a que ciertos endpoints interpreten erróneamente las rutas especificadas. Un ejemplo clásico es el conflicto que puede surgir entre una ruta con un parámetro dinámico y una ruta estática.
Si tienes, por ejemplo, los endpoints /products/:id y /products/filter, debes asegurarte de que la ruta más específica (en este caso, /products/filter) esté definida antes que la ruta con el parámetro dinámico:
app.get('/products/filter',(req, res)=>{ res.send('Estoy en el filtro');});app.get('/products/:id',(req, res)=>{ res.send(`Producto con ID: ${req.params.id}`);});
Hacerlo de esta manera garantiza que las rutas específicas se evalúen antes que las rutas genéricas, evitando así los errores.
Comentarios finales
Las capacidades que ofrecen los Query Parameters y herramientas como Faker.js son esenciales para el desarrollo eficiente y seguro en aplicaciones web. Optimizar el manejo de rutas y parámetros mejora la estructura y funcionalidad de las aplicaciones, permitiendo un mejor control y mantenimiento del código. Además, el aprendizaje continuo y la práctica constante son claves en el dominio de estas tecnologías. ¡No dejes de explorar y mejorar!
En el momento que estoy publicando este comentario. La última versión 6.6.6 de faker esta rota, o mejor dicho, la librería no tiene nada!. Tuve que instalar la versión 5.3.3 con:
npm i faker@5.5.3-S
Muchas gracias por el tip.
Genial, gracias por el aviso, me estaba comenzando a quebrar la cabeza con eso XD
Hola, en este momento faker esta en la versión 7.2.0 y se importa de esta manerá:
Gracias profe ojala, muchos podamos dar like para que este comentario suba y pueda ser visto
La versión que tienen que instalar es esta:
npm i @faker-js/faker
ya que la original es la que está corrupta
Los endpoints especificos deben declararsen antes de los endpoints dinamicos. Uno de los mandamientos.
Excelente aclaracion
min : 10:53
jaja si, me quedé que paso?
Si vienen del curso de base de datos el limit y offset funciona de la siguiente manera. EJEMPLO:
SELECT*FROM tablaUsuarios LIMIT5OFFSET3;
El resultado será los 5 registros de la 'tablaUsuarios' que se encuentren luego de los 3 primeros registros.
No deberiamos instalar faker como dependencia de desarrollo?
npm i faker -D
Buen punto! Creo que tienes razón, ya que solo es para las pruebas...
Disculpa, no sé mucho sobre terminal de Linux. ¿Cuál es la diferencia entre instalarlo como dependencia "-D"?
A día de hoy la imagen ya no funciona con
image: faker.image.imageUrl()
Se debe usar
image: faker.image.url(),
Igual en la terminal al correr el servidor dirá el error
[@faker-js/faker]: faker.image.imageUrl is deprecated since v8.0 and will be removed in v9.0. Please use faker.image.url instead.
Gracias compa, si tenia el error, solucionado.
Me preguntaba por que no me sucedía el error del filter, y era por que lo tenia bien 🤦♂️
Parece chiste pero es anecdota :)
jajaja
Faker no me funciona como al profe jajaj xd vean este video platzi en YT
Deben descargarlo como
npm i --save-dev faker@5.5.3
Gracias ompañero, solucionado.
Increible aporte, muchas gracias.
No conocía este módulo de faker, buena herramienta para poblar BD de prueba de manera rápida!!
Excelente dato!!
si, mucho mejor que hacerlo a mano
es de mucha utilidad
GET: Recibir parametros & Parametros Query
al utilizar app.get ya podemos empezar a usar este verbo en nuestro endpoint.
Al colocar : en la ruta, podemos tomar ese valor como parametro:
'/product/:id'
para tomar los parametros que se envian a través de la ruta, podemos usar el objeto req.params . Allí se almacenarán todos los parametros que enviemos en la url
app.get('/products/:id',(req, res)=>{const{ id }= req.params;}
a partir de ese id, podemos acceder a otros endPoints a partír de allí. Por ejemplo
Se utilizan para hacer filtros a la información que queremos de nuestra API.
Puede ayudarnos a paginar, a establecer limites, incluso buscar palabras que coincidan con un valor.
Los endpoints especificos deben declararsen antes de los endpoints dinamicos. Uno de los mandamientos
Para evitar declarar 2 variables que hacen referencia a la misma cosa, como en el caso de size y limit, se puede simplificar el proceso de esta forma:
expressApp.get('/products',(request, response)=>{const{ limit }= req.query;const products =[];for(let i =0; i <(limit ||10); i ++){// Suponiendo que nuestro límite por defecto es 10 products.push({companyName: faker.company.companyName(),productName: faker.commerce.productName(),productPrice:Number(faker.commerce.price()),productImage: faker.image.imageUrl()});}; response.json({limit: limit ||'No limit defined',data: products
});});
Utilizando el parámetro limit directo dentro del for, no es necesario declarar size que luego después se convierte en limit. Siento que se ve un poco más estético y mantiene un poco más la semántica de las variables utilizar limit desde inicio hasta fin.
Además recomiendo ampliamente estructurar el json de respuesta de tal forma que devuelva la respuesta principal (en este caso la lista de productos) dentro de un atributo (en este caso data), y así dejar abierta la posibilidad de enviar atributos adicionales, como en este ejemplo, se devuelve el límite, pero podríamos utilizarlo para devolver información como número de registros, información de paginación o cualquier otra info que pueda ser útil para nuestro frontend.
Happy coding!!
Excelente solución, otra opción es esta:
const{ size =10}= req.query;
De esta forma puedes usar la variable size en cualquier parte, y si no está definida, por defecto es este caso será 10.
Este video no es de este curso, hice este curso hace poco, regrese para repasar y por alguna razon esta este video en lugar que el de querys que es el que corresponde, ¿Pueden arreglarlo?
gracias estamos trabajando en ello
x2
Para marzo 2023, el repositorio de faker dejó de funcionar, entonces se creó otro, que debe ser instalado e importado. Aquí los pasos;
npm install @faker-js/faker --save-dev
y luego importar el require en el archivo index.js:
const{ faker }=require('@faker-js/faker');
me funciona, gracias!!
hice exactamente esto y el get del profesor, pero al buscar localhost:3000/products me dice que "no se puede acceder a este sitio". O sea no encuentra la pagina.
Sospecho poderosamente que esta clase corresponde al curso de NodeJS con PostgreSQL, lo se porque es el siguiente curso de la ruta, cuando vi esta clase ayer, no recuerdo haber visto esto, evidentemente el sistema de carpetas no coincide entre un proyecto y otro (aqui no hemos visto bases de datos), y el profesor tiene el mismo poleron que en el curso de NodeJS con PostrgreSQL cuando aqui estaba vestido de verde en la clase anterior y la siguiente... FBI, estoy listo para ustedes
Gracias por el reporte estamos trabajando en ello, puedes usar el server C por favor?
Felipe creo que si tienes razón.
@mayra ya intente el server C y sigue la clase que no es.
Yo lo hice de esta forma: Generé un archivo llamado users que se encarga de crear el arreglo con los datos iniciales
users.js
const faker =require('faker');constinit=()=>{const result =[];for(let i =0; i <200; i++){ result.push({id: i,firstName: faker.name.firstName(),lastName: faker.name.lastName(),gender: faker.name.gender(),});}return result;};module.exports={ init };
luego, en el index inicializo el objeto con los usuarios
app.listen(port,()=>{ initialDB ={users: users.init(),};console.log(`Server running at port ${port}`);});
y finalmente filtro los usuarios en la operación get
app.get('/users',(req, res)=>{const{ offset, limit }= req.query;const result =[];if(offset && limit){/* Los parámetros requperados de query,
vienen como string, es necesario pasarlos a int*/for(let i =parseInt(offset); i <parseInt(limit); i++){ result.push(initialDB.users[i]);} res.json(result);}else{ res.send('No data found');}});
Espero sus comentarios
En la actualidad, hay una vulnerabilidad de seguridad en la dependencia "faker" ...habrá otra alternativa? .. o que nos recomiendan cuando suceden estos imprevistos? :) gracias de antemano a quien pueda sacarme de esta duda
El autor bajó el proyecto y usó el repositorio para dar un mensaje. La comunidad rescató el repositorio y lo seguirán manteniendo como community-faker: https://www.npmjs.com/package/community-faker
graciaaas!! fip3torrejon :) intentare con npm i community-faker
Para los qué no les funciona faker.
instalar por npm:
npm install @faker-js/faker --save-dev
Declararlo:
const{ faker }=require('@faker-js/faker');
Para los que les esté saliendo un error al tratar de importar el módulo de faker, es normal, instalen la dependencia con la version 5.5.3 (npm i faker@5.5.3), que es la version anterior a que se borrara el source code. La persona que le daba soporte decidió borrar el source code. Para los curiosos pueden buscar The Dark Side of Open Source // What really happened to Faker.js? en youtube, el video de fireship se explica brevemente que paso con la librería
mil gracias, con tu comentario lo solucione
Es un paquete que nos ayuda a generar grandes cantidades de datos falsos. Puede genrar datos tanto para Navegadores como para Node.JS
Nota: Puede generar datos en diferentes idiomas!!
Para instalarlo:
<npm install faker>
Un ejemplo de uso:
const faker =require('faker');let randomName = faker.name.findName();// Rowan Nikolauslet randomEmail = faker.internet.email();// Kassandra.Haley@erich.bizlet randomCard = faker.helpers.createCard();// crea un contacto random de tarjeta con muchas propiedades
Para generar datos en un idioma en específico hay que definir la propiedad 'faker.locale' según los valores de su documentación.