‫Instructor: Entonces, ya
‫aprendió a crear nuevos documentos en la base de datos.
‫Pero en esta conferencia les
‫mostraré una manera más fácil e incluso mejor de hacerlo,
‫ya que implementamos nuestro controlador de creación de recorridos.
‫Entonces, en este punto, nuestra
‫API básicamente ya no hace nada.
‫Ya no funciona
‫porque básicamente eliminamos toda la funcionalidad que
‫teníamos en el último video.
‫Y lo hicimos, para que en las
‫próximas conferencias podamos reconstruirlo usando una base de datos real.
‫Bien, básicamente, finalmente construimos nuestra API real.
‫Y comenzaremos implementando la
‫función createTour.
‫Pero recuerde la función de controlador que
‫se llama tan pronto como hay una solicitud de
‫publicación en la ruta de recorridos.
‫Así que eso es lo que tenemos aquí en tourRoutes.
‫Pongamos eso aquí.
‫Entonces, lo que acabo de decir es esto.
‫Así que tenemos este checkBody aquí.
‫Lo que en realidad
‫es algo que también podremos eliminar.
‫Entonces, ¿dónde está eso, en realidad?
‫checkBody está bien,
‫así que esta es otra de estas funciones que
‫realmente ya no necesitamos.
‫Porque esto fue básicamente para validar el cuerpo.
‫Entonces, para ver si tenía el nombre o el precio de la propiedad en ellos.
‫¿Derecha?
‫Pero ahora nuestro modelo
‫de mangosta se encargará de eso.
‫Y nuevamente, esto aquí
‫fue bueno para mostrarnos cómo funciona el middleware,
‫pero ahora podemos deshacernos de él.
‫De acuerdo, también lo borraré de aquí.
‫Dale un nuevo guardado.
‫Y ahora ha vuelto a funcionar.
‫De todos modos, la función que
‫estamos creando ahora es esta función createTour.
‫Donde solo se llamará a un
‫dato tan pronto como alguien llegue a la ruta del tour con una solicitud de publicación.
‫Bien, solo para recapitular eso porque
‫sé que puede ser un
‫poco confuso con estos diferentes archivos y diferentes
‫carpetas y diferentes funciones.
‫Pero también es muy
‫importante que comencemos a organizar nuestro código
‫desde el principio.
‫¿Okey?
‫De todos modos, estamos aquí en la función createTour.
‫Y ahora vamos a crear una nueva gira.
‫Y lo haremos basándonos en los
‫datos que provienen del cuerpo.
‫¿Recuérdalo?
‫Ahora recuerde cómo solíamos crear documentos hace
‫un par de conferencias.
‫Así que lo hicimos así.
‫Por ejemplo, digamos newTour y
‫luego igual a
‫newTour y luego los datos allí.
‫Así que lo hicimos así y luego es una nueva gira.
‫Y luego escribimos newTour. guardar y
‫eso funciona un poco bien.
‫Pero podemos hacerlo de una manera aún más sencilla.
‫Entonces, en lugar de hacer esto,
‫podemos hacer Tour. cree y luego pegue los datos allí.
‫Está bien y eso hará exactamente lo mismo.
‫La principal diferencia es que en esta versión
‫aquí básicamente llamamos al método directamente en el recorrido,
‫mientras que en esta primera versión llamamos al método
‫en el nuevo documento.
‫Está bien, y eso es completamente diferente.
‫Así que nuevamente tuvimos el recorrido que creamos a
‫partir del modelo.
‫Y luego en esa gira usamos el método de guardar.
‫Porque el documento tiene acceso a este método
‫y también a muchos otros métodos.
‫Pero aquí, en la segunda situación,
‫llamamos a este método de creación directamente en el modelo en sí, ¿de acuerdo?
‫Ahora recuerde cómo este método de guardar aquí devolvió una promesa.
‫Y así, esta creación aquí también devuelve una promesa.
‫Y entonces, para tener acceso al documento de archivo
‫tal como fue creado en
‫la base de datos, deberíamos haber usado. ¿entonces de acuerdo?
‫Pero en lugar de usar promesas como esta,
‫comenzaré a usar async await.
‫Bien.
‫Entonces, esta función aquí debería ser una función asíncrona.
‫Entonces, todo lo que
‫tenemos que hacer es escribir async aquí.
‫Así que tenemos async y ahora podemos esperar el resultado de
‫esta promesa aquí.
‫Así que espero que esté familiarizado con esto.
‫Y de hecho tengo una sección en
‫este curso que trata exactamente de este tipo de cosas.
‫Entonces, si no vio
‫esa sección pero aún no está 100% familiarizado con async
‫await, continúe y mire esa sección para
‫que realmente comprenda lo que está sucediendo aquí.
‫De acuerdo, en lugar de usar esto, usaré async
‫await y luego guardaré el
‫valor de resultado de esta promesa en la
‫nueva variable tour.
‫Bien, ahora la última pieza del rompecabezas
‫aquí es, por supuesto, pasar algunos datos reales a este método de creación.
‫Entonces, en lugar de este
‫objeto vacío, pasaremos el cuerpo de la solicitud,
‫por lo que req. body y esos son los
‫datos que vienen con la solicitud de publicación, ¿verdad?
‫Ahora solo una
‫vez más, solo para asegurarse de que todo le quede claro.
‫De acuerdo, podemos usar el modelo de recorrido directamente y
‫llamar al método de creación en él.
‫Luego, a esa función pasamos los datos que
‫queremos almacenar en la base de datos como un nuevo recorrido.
‫Y esos datos provienen del cuerpo de la publicación, ¿verdad?
‫Y eso se almacena dentro del cuerpo del punto de la solicitud.
‫Entonces esta variable aquí.
‫Ahora, este método aquí devolverá una promesa.
‫Y esperamos esa promesa usando async
‫await y luego almacenamos ese resultado en la variable
‫newTour, que será el documento
‫recién creado que ya tiene la ID y todo, ¿de acuerdo?
‫Así que guardaré
‫este código aquí solo como referencia.
‫Y por ahora, recuperemos este dato.
‫En realidad, es un fragmento de código.
‫Dale una oportunidad.
‫Y ahora obtenemos este error de pelusa ES.
‫Así que echemos un vistazo
‫a eso, solo coloque nuestro mouse aquí.
‫Y nos dice que las funciones asíncronas no son compatibles
‫hasta este nodo 7. 6 y, por lo tanto,
‫este error de pelusa de ES proviene de ese complemento de
‫nodo que realmente instalamos.
‫Entonces puedes ver eso aquí.
‫Muy bien, entonces lo que vamos a hacer para solucionar esto es
‫simplemente ir al paquete. json y
‫aquí encontrará la versión de
‫nodo que estamos usando.
‫Entonces eso es muy simple.
‫Solo necesitamos especificar la propiedad de los
‫motores aquí en nuestro documento json.
‫Y establezca el nodo en mayor o
‫igual que 10.
‫Bien, y eso es porque en
‫este curso estamos usando al menos el nodo diez.
‫Entonces 7. 6 sería suficiente para hacer desaparecer ese
‫error pero, por supuesto, especificamos la versión real
‫que estamos usando.
‫Así que le damos una oportunidad a este.
‫Cierra eso.
‫Y ahora nuestro error aquí ha desaparecido.
‫Ahora solo un paso más antes de que podamos probar
‫esto en nuestra aplicación Postman.
‫Y eso es que realmente necesitamos manejar los errores.
‫De acuerdo, así que tenga en cuenta que
‫con async await necesitamos probar los errores usando la sintaxis try catch.
‫Entonces escribimos un bloque de prueba.
‫Luego, envuelva todo nuestro código allí.
‫Y luego, finalmente, un bloque de captura.
‫Que como ya sabemos tiene acceso al objeto de error.
‫¿Y ahora qué ponemos realmente aquí?
‫Bueno, debemos pensar
‫cuándo puede ocurrir exactamente un error.
‫Así que recuerde como hace dos
‫conferencias cuando estábamos creando nuestros primeros documentos.
‫Recibimos un error en
‫ese entonces cuando intentamos crear un
‫documento sin uno de los campos obligatorios, ¿verdad?
‫Y eso fue un error de validación.
‫Y es uno de los errores que quedarían atrapados aquí.
‫De acuerdo, porque si intentáramos crear un documento,
‫digamos sin uno de los campos
‫obligatorios, entonces esta promesa que
‫se crea aquí sería rechazada, ¿de acuerdo?
‫Entonces, si tenemos una promesa rechazada
‫aquí, entrará en el bloque de captura.
‫Y por lo tanto, básicamente en este bloque
‫de captura aquí queremos enviar
‫una respuesta diciendo que hubo un error.
‫Muy bien res. estado aquí de nuevo y
‫400 que representa una mala solicitud. json y ahora algo muy similar a este,
‫pero su
‫estado y eso es fallar y
‫luego, en lugar de datos aquí, enviamos un
‫mensaje y, por ahora, establezcamos el mensaje en el error.
‫Bien.
‫Y
‫ahora finalmente regresemos a nuestra aplicación Postman y pruébelo.
‫Bien, cree este y ahora
‫creemos un nuevo recorrido.
‫Así que ahora mismo aquí
‫tenemos el nombre,
‫la duración, la dificultad y el precio, así que
‫agreguemos también la calificación y eso
‫debe estar entre comillas dobles 4. 7.
‫Muy bien, y ahora llega el momento.
‫Envía y de hecho aquí vamos.
‫Así que esta es la gira
‫que acabamos de crear.
‫Tenemos nuestra calificación.
‫Tenemos nuestro nombre y tenemos nuestro precio.
‫Y, por supuesto, el ID creado automáticamente.
‫Ahora puede notar que no tenemos ninguna dificultad
‫ni precio.
‫Bueno, ¿por qué crees que es así?
‫Bueno, eso se debe a que estos dos campos en realidad
‫no están en nuestro esquema y, por lo
‫tanto, no se colocan en la base de datos.
‫Entonces, todo lo demás que no esté en
‫nuestro esquema simplemente se ignora.
‫Entonces ese es el poder de nuestro esquema, ¿de acuerdo?
‫Genial, ahora intentemos enviar esto nuevamente y
‫eso debería darnos un error, ¿verdad?
‫Y de hecho ahí vamos.
‫Tenemos nuestras 400 solicitudes incorrectas.
‫Y tenemos este mensaje que es el
‫error completo que obtuvimos.
‫Y aquí vemos que el mensaje de error es clave duplicada.
‫Y eso es porque ya tenemos el Test Tour 2.
‫Y entonces no pudo crear otro.
‫Así que creemos otro aquí como Jonas Tour.
‫Realmente no importa, ¿de acuerdo?
‫Solo quiero crearlo, primero
‫sin nada de esto solo
‫para ver si obtenemos otro error.
‫Y, de hecho, obtenemos algunos errores más aquí.
‫Esta vez diciendo que la validación del tour
‫falló porque un tour debe
‫tener un precio.
‫Bien, entonces ves que ahora mismo tenemos
‫este tipo de estructura de error extraña aquí.
‫Entonces Mongo DB devuelve este enorme objeto de error completo.
‫Y más adelante nos encargaremos de eso.
‫Así que tendremos una sección completa sobre el manejo de errores solamente.
‫Y para entonces crearemos algunos errores más significativos.
‫Bien, por ahora reemplacemos este objeto de
‫error con una cadena normal aquí.
‫Digamos que se enviaron datos no válidos.
‫De acuerdo, no hagas algo como esto en una aplicación de producción real,
‫pero nuevamente tendremos un poco de manejo
‫de errores reales un poco
‫más tarde que se encargará de eso.
‫Bien, mostrando errores significativos al cliente.
‫Así que regresemos aquí y envíelo
‫de nuevo.
‫Y ahora tenemos esta cadena normal aquí.
‫Así que creemos el precio aquí.
‫Pongámoslo en 567 y
‫luego envíelo.
‫Y ahora verá que nuestra calificación
‫predeterminada aquí todavía funciona.
‫Ahora averigüemos todo esto también con la brújula.
‫Y de hecho obtenemos nuestros cuatro recorridos en la base de datos.
‫Así que todas estas pruebas raras que hemos estado
‫haciendo hasta este momento.
‫Así que sigamos adelante y eliminemos estos dos últimos.
‫Eso fue realmente solo para probar.
‫Bien.
‫Supongo que algo salió mal aquí.
‫Bien, ahora volvemos a estos dos.
‫Vamos a crear ahora el tercero que teníamos
‫antes en la última sección.
‫Que es el Snow Adventurer.
‫Así que el Snow
‫Adventurer.
‫El precio fue ...
‫Ya no estoy
‫seguro como 697 tal vez.
‫Y la calificación
‫es como seis o en realidad 4. 8.
‫Envió a ese tipo.
‫Y así, de hecho, aquí vamos.
‫Excelente.
‫Solo para recapitular rápidamente nuestra función createTour.
‫Así que tenemos un intento de captura aquí porque en realidad estamos usando
‫una función de espera asíncrona aquí.
‫Bien, usamos async await porque
‫esta gira. create devuelve una
‫promesa que estamos esperando
‫para que luego podamos almacenar el documento de
‫viaje recién creado dentro de esta variable
‫y luego enviarlo junto con
‫la respuesta al cliente aquí abajo.
‫Está bien, pero en caso de que haya
‫un error, como un error de
‫validación, por ejemplo, ese error
‫se detectará y enviaremos algo más
‫al cliente con este mensaje de error.
‫Así es como creamos documentos usando mongoose.
‫A continuación, hablaremos sobre la lectura de documentos.