‫Narrador: Ahora, otra característica extremadamente importante
‫de una buena API es proporcionar paginación.
‫Básicamente, permitirle al usuario
‫seleccionar solo una determinada página de nuestros resultados, en
‫caso de que tengamos muchos resultados.
‫Así que supongamos que tenemos,
‫por ejemplo, 1000 documentos en una colección determinada.
‫Y decimos que en cada página tenemos 100 documentos.
‫Entonces eso significaría que tendríamos 10 páginas, ¿verdad?
‫Entonces 10 por 100 es 1000.
‫Y en base a eso, ¿cómo vamos a implementar la
‫paginación usando una cadena de consulta?
‫Bueno, usaremos la página y delimitaremos campos.
‫Entonces habrá un campo de página.
‫Digamos que queremos la página dos y
‫habrá un campo de límite.
‫Y este límite aquí básicamente significa la cantidad
‫de resultados que queremos por página.
‫Y eso en realidad se establece aquí solo en 10
‫y, por supuesto, tenemos que corregir este aquí.
‫No es una coma, sino una y.
‫Así que la página dos y el límite 10.
‫Ahora volviendo al ejemplo de 1000 resultados, si
‫el límite es 10, entonces solo 10 resultados por
‫página, entonces tendremos 100 páginas
‫y aquí mostraremos la página número 2
‫de estas 100 páginas.
‫¿Okey?
‫Ahora, necesitamos una forma de implementar esto usando Mongoose.
‫Así que echemos un vistazo a cómo podríamos hacerlo
‫volviendo a nuestro código.
‫Así que la función número
‫cuatro, la paginación.
‫Muy bien,
‫y comenzaré creando una consulta de ejemplo
‫aquí como lo hicimos antes.
‫Entonces, digamos que la consulta es igual a la consulta.
‫Y ahora, ¿qué tipo de métodos
‫tenemos para implementar la paginación?
‫Bueno, el más útil es saltar y voy
‫a explicar lo que hace en un segundo, así
‫que pongamos un número aleatorio aquí.
‫Así que salte y limite, y
‫pongamos 10.
‫por lo que este límite aquí es exactamente el mismo que
‫el límite que definimos en la cadena de consulta.
‫Básicamente, la cantidad de resultados que
‫queremos en la consulta.
‫Y luego omitir, que tenemos aquí, es la cantidad de resultados
‫que se deben omitir antes de consultar los datos.
‫Muy bien, de nuevo, esto es solo un marcador de posición aquí.
‫Volvamos a este ejemplo que tenemos aquí.
‫Solo voy a copiar esta cadena de consulta aquí.
‫digamos que el usuario quiere la página número
‫dos con 10 resultados por página.
‫Eso significa que los resultados del uno al 10 están en la página uno
‫y del 11 al 20 están en la página 2.
‫De acuerdo, eso significa que queremos omitir 10 resultados
‫antes de comenzar a realizar consultas.
‫Bueno.
‫Entonces, nuevamente, del uno al 10 son
‫para la página uno y
‫luego del 11 al 20 son para
‫la página
‫dos, y así sucesivamente.
‫Entonces, 21 a 30 serán la página tres,
‫y así sucesivamente.
‫Entonces, debemos omitir 10
‫resultados para llegar al resultado número 11, ¿verdad?
‫Entonces, al resultado número 11, que será el primero en la página dos.
‫De acuerdo, y dado que se solicitó la página dos,
‫bueno, nuevamente debemos omitir 10 resultados antes
‫de comenzar la página dos.
‫¿Okey? ¿Tener sentido?
‫Y, por ejemplo, si solicitamos la página número tres,
‫entonces, por supuesto, primero tendrían
‫que omitirse 20 resultados.
‫Y, por lo tanto,
‫necesitaremos alguna forma de calcular este valor de omisión aquí.
‫Así que basándome básicamente en la página y el límite.
‫Ahora podría preguntar por qué no pido directamente el valor de
‫omisión en la cadena de consulta, pero eso
‫se debe a que para el usuario este valor aquí
‫es algo abstracto, ¿de acuerdo?
‫Es mucho más fácil decir simplemente, "Bueno, quiero la página número uno", o quiero la
‫página número cinco "o quiero la
‫página número 10. "De acuerdo,
‫para el usuario es mucho más fácil no lidiar
‫con valores de omisión aquí y
‫todo eso, el usuario quiere que sea fácil
‫y simplemente definir una página.
‫Ahora, antes de que podamos
‫comenzar a calcular el valor de omisión, primero debemos obtener la página
‫y el límite de la cadena de
‫consulta y también debemos definir algunos valores predeterminados.
‫Bien, eso es básicamente
‫porque todavía queremos tener paginación
‫incluso si el usuario no especifica ninguna
‫página o límite.
‫Porque, por ejemplo, digamos que tenemos un millón de
‫resultados en nuestra base
‫de datos, y luego, por supuesto, cuando el usuario
‫realiza la solicitud, simplemente no mostramos todos estos 10 millones de resultados.
‫Eso no sería muy fácil de usar, ¿verdad?
‫Y así, definiré por defecto la página número uno
‫y un límite de digamos 100.
‫Entonces, de manera predeterminada, cuando un usuario solicita todos los
‫recorridos en este ejemplo, solo obtiene 100, y
‫no un millón, ¿de acuerdo?
‫Entonces, la página es, por supuesto, una solicitud. consulta. página y ahora
‫voy a multiplicarlo por uno, que es
‫solo un buen truco para convertir
‫una cadena en un número.
‫De acuerdo, tal vez haya notado antes que cada vez
‫que ponemos un número en una
‫cadena de consulta, será una cadena o un objeto
‫de consulta, por lo que debemos solucionarlo simplemente multiplicándolo por uno.
‫De acuerdo, y luego, por defecto, queremos la página número uno.
‫¿Está bien?
‫Y esta es una buena
‫forma en JavaScript de definir básicamente valores predeterminados.
‫Y estoy seguro de que estás familiarizado con eso, ¿verdad?
‫De todos modos, el límite está en req. consulta. límite de veces
‫uno nuevamente para convertirlo, o
‫el valor predeterminado de 100 que acabamos de mencionar.
‫Entonces, idealmente, el usuario solo especificará el número de página que solicita
‫y ni siquiera
‫se molestará con el límite de páginas.
‫Eso es para casos de uso más específicos.
‫Bien, y ahora todo lo que tenemos que hacer es definirlo para calcular
‫básicamente ese valor
‫de omisión del que acabamos de hablar aquí antes.
‫Y la mejor forma de hacerlo es volver a un ejemplo.
‫Entonces, nuevamente, digamos que estamos solicitando la página número tres, con
‫el límite de 10.
‫y vemos aquí para la página número tres los resultados son
‫de 21 a 30.
‫Entonces comienza en el resultado número 21, lo que significa
‫que debemos omitir 20 resultados.
‫Y 20 resultados es básicamente dos veces 10,
‫es decir, dos veces este límite.
‫De acuerdo, y a partir de ahí comenzamos a obtener una fórmula.
‫Entonces, dos por diez es básicamente tres menos uno por 10.
‫Y tres es la página en la que estamos.
‫Entonces esa es nuestra fórmula.
‫Así que la página menos uno
‫y, por tanto, la página anterior,
‫básicamente, multiplica
‫el límite.
‫Bien, espero que tenga sentido, ahora
‫reemplacemos estos valores aquí.
‫Salto
‫y límite de límite.
‫¿Okey?
‫Básicamente, este número aquí son todos los resultados que vienen
‫antes de la página que estamos solicitando ahora.
‫Entonces, nuevamente, si estamos solicitando la página número tres,
‫nuestros resultados comenzarán en la página número 21.
‫Y queremos saltarnos 20 resultados antes de eso.
‫Entonces, 20 resultados se
‫debe a que tenemos 2 páginas por 10 resultados
‫en cada uno. Sí, será la página que acabamos de solicitar.
‫Entonces, página aquí, menos uno, por lo
‫que la página anterior multiplica el número de resultados en
‫cada página.
‫Bien, esa es la cantidad de documentos
‫que se omitirán.
‫Bien, espero que tenga sentido.
‫Ahora sigamos adelante e intentemos esto.
‫Y dado que aquí solo tenemos muy pocos resultados,
‫debemos probarlo con un límite realmente pequeño.
‫Entonces, digamos que solo queremos tres resultados por página, y comencemos
‫en la página número uno.
‫Así que envíalo, y de hecho ahora solo obtendremos
‫tres resultados como puedes ver aquí.
‫Entonces estos tres, veamos.
‫Así El caminante del bosque, el
‫explorador marino y el vagabundo
‫de la ciudad.
‫¿Okey?
‫Probemos la página número dos
‫y, por alguna razón, el cartero sigue
‫saltando cada vez que cambio la URL.
‫De todos modos, ahora tenemos The Park
‫Camper, The Snow
‫Adventurer y The Sports Lover.
‫Entonces empiezas a ver
‫que ahora tenemos diferentes recorridos.
‫¿Okey?
‫Y entonces podemos decir que nuestra paginación
‫aquí ya está funcionando.
‫Ahora la última página,
‫y ahora tenemos The Northern Lights,
‫The Wine
‫Taster y The Star Gazer.
‫¿Está bien?
‫Ahora, ¿qué pasa si intentamos ir a la página número cuatro?
‫Ya sabemos que solo tenemos nueve recorridos,
‫por lo que en la página número cuatro no debería haber nada.
‫¿Derecha?
‫Así que probemos eso.
‫Y de hecho obtenemos cero resultados.
‫Pero eso, por supuesto, no es lo ideal.
‫Bien, y ahora vayamos y solucionemos eso y,
‫básicamente, arrojemos un error cada vez que el
‫usuario seleccione una página que no existe.
‫Porque esa es básicamente la situación aquí.
‫El usuario solicitó una página que simplemente no existe.
‫No tenemos suficientes resultados para tener cuatro páginas con
‫tres resultados.
‫Hagamos ahora eso, y esto
‫solo sucederá
‫cuando haya una página en la
‫consulta, así que creemos esta declaración if aquí.
‫Así que si lo solicita. consulta. , solo en
‫este caso probaremos si nos estamos saltando más
‫recorridos de los que realmente tenemos.
‫Entonces, obtengamos la cantidad de recorridos.
‫Entonces, el número de recorridos es igual a, y ahora
‫vamos a aprender un nuevo método.
‫Así que hay un nuevo método
‫en el modelo Tour que se llama countDocuments.
‫¿Okey? Y como dice el nombre,
‫esto va a devolver la cantidad de documentos, ¿de acuerdo?
‫En realidad, devolverá una promesa, pero
‫luego esperamos la promesa y
‫luego regresará con el
‫resultado de la cantidad de giras.
‫¿Okey? Entonces, si la cantidad de documentos
‫que omitimos es mayor que la cantidad de documentos que
‫realmente existen, entonces eso significa que la página no existe, ¿de acuerdo?
‫¿Eso tiene sentido?
‫Entonces, si el salto es mayor que el número
‫de recorridos, y por ahora,
‫lo que voy a hacer aquí es lanzar un nuevo error.
‫¿Okey?
‫Entonces lanza un
‫nuevo error, esta página no existe.
‫Ahora, ¿por qué arrojo un error aquí?
‫Bueno, simplemente porque si arrojo un error
‫aquí en el tribloque en el que estamos
‫actualmente, se
‫moverá automática e inmediatamente al bloque de
‫captura, y luego devolverá este tipo de mensaje de error 404.
‫¿Okey?
‫Y eso es lo que queremos por ahora.
‫Solo tenga en cuenta que implementaremos un manejo de errores mucho
‫mejor más adelante en el curso.
‫Y de hecho, en la siguiente sección, ¿de acuerdo?
‫Pero por ahora, hagámoslo simple, arroje
‫este error aquí en caso
‫de que intentemos omitir más documentos de los
‫que realmente tenemos.
‫¿Okey?
‫Entonces este es el caso correcto, enviémoslo aquí y
‫ese no es el resultado que esperaba, así
‫que regresemos, así
‫que ahora nuestra página es cuatro
‫y el límite es tres.
‫Entonces, el salto aquí sería tres veces tres, entonces nueve, ¿de acuerdo?
‫Y el número de recorridos también es nueve, por lo
‫que el salto no es mayor que el número de recorridos y,
‫por lo tanto, no obtenemos este error.
‫Entonces, lo que debemos hacer es establecerlo en mayor o igual.
‫Está bien, y eso debería funcionar ahora.
‫Y eso lleva mucho tiempo, y
‫así fue.
‫Ahora obtenemos el estado de falla aquí y
‫un 404.
‫Por
‫alguna razón, este error no aparece
‫aquí, como debería ser.
‫Pero no se preocupe por eso, eso no es realmente importante.
‫Lo que importa es que realmente entró en nuestro bloque de
‫captura y luego envió esta respuesta 404.
‫Todo lo demás lo implementaremos un poco más tarde.
‫Está bien, y eso es todo.
‫Así que esos son todos los métodos que agregaremos a
‫nuestra consulta, y cuando finalmente lleguemos a la siguiente línea
‫de código aquí, nuestra consulta
‫será esperada y regresará con los recorridos.
‫De acuerdo, y en este
‫punto
‫nuestra consulta podría verse algo
‫así, algo como
‫esto, algo así como bueno,
‫¿qué tenemos aquí? también, por
‫lo que
‫es una gran consulta.
‫Y nuevamente, lo que nos permite eso
‫es que cada uno de estos métodos aquí siempre devolverá
‫una nueva consulta que luego podemos encadenar en el
‫siguiente método
‫y el siguiente método, y el siguiente método hasta que finalmente esperemos
‫la consulta para que pueda en realidad nos dan nuestros documentos.
‫Bien, eliminémonos de todos estos comentarios y sí,
‫eso es todo por ahora.
‫Para estas características, solo agregaremos una más en
‫la próxima lección, pero
‫esa será un poco diferente a estas.
‫No va a utilizar uno de estos métodos de consulta, ¿de acuerdo?
‫Así que espero que en las últimas conferencias
‫hayas aprendido los entresijos
‫de la consulta de datos con Mongoose.
‫Entonces, por supuesto, todos estos métodos que usamos
‫no solo son útiles para estas características que implementamos aquí.
‫Realmente puede crear todo tipo
‫de consultas que pueda imaginar para todo tipo de aplicaciones.
‫Así que le mostré todas las técnicas aquí en
‫este contexto de estas diferentes características de
‫API, pero por supuesto que
‫podrá usarlas en todas sus aplicaciones en el futuro, ¿de acuerdo?
‫Así que espero que haya
‫sido divertido para usted y, si lo fue, pasemos ahora a la siguiente.
‫¡Nos vemos!