‫Jonas: Ahora implementemos un controlador de ruta
‫para las solicitudes de publicación para que podamos agregar un Natour a nuestro
‫conjunto de datos.
‫Así que, al igual que con el controlador
‫de solicitudes doGET (), comencemos agregando una nueva ruta.
‫Así que app. publique esta vez, y recuerde
‫que ahora usamos post así que el método
‫post aquí, porque ese es el tipo de solicitud que queremos manejar.
‫Entonces, las solicitudes que se realizan con el verbo de publicación http, ¿verdad?
‫V1
‫y recorridos.
‫Tal como hablamos en la conferencia de la API REST,
‫la URL es exactamente la misma.
‫No importa si queremos obtener todos los recorridos o
‫si queremos crear un nuevo recorrido, la
‫URL es exactamente la misma.
‫Entonces, lo único que cambia es el método http
‫que usamos para hacer estas solicitudes.
‫Para obtener todos los recorridos y publicar para crear un nuevo
‫recorrido, entonces aquí, nuestra función típica de devolución
‫de llamada donde obtenemos acceso a
‫la solicitud y al objeto de respuesta para que podamos obtener
‫algunos datos de la solicitud y enviar de vuelta un respuesta.
‫Ahora recuerde que con una solicitud
‫de publicación, podemos enviar datos desde el cliente al servidor, ¿verdad?
‫Entonces, estos datos están idealmente disponibles en la solicitud.
‫El objeto de solicitud nuevamente es lo que contiene todos los
‫datos, toda la información, sobre la solicitud que se realizó.
‫Si esa solicitud contiene algunos datos que
‫se enviaron, esos datos deberían estar en la solicitud, ¿verdad?
‫Ahora, listo para usar, Express no incluye esos datos corporales
‫en la solicitud, y para tener esos datos disponibles, tenemos
‫que usar algo llamado middleware.
‫Hablaremos en gran detalle sobre el middleware en un
‫par de conferencias, pero por ahora,
‫para que esto funcione, necesitamos
‫incluir un middleware simple aquí en la parte superior del archivo.
‫Así que en realidad, aquí mismo.
‫Lo que tenemos que hacer es decir app. utilizar y luego
‫expresar. json Está bien, y
‫eso es todo.
‫Así que de nuevo, esto [express. json] aquí está el middleware.
‫Y el middleware es básicamente una
‫función que puede modificar los datos de la solicitud entrante.
‫Se llama middleware porque se
‫encuentra en medio de la solicitud y la respuesta.
‫Es solo un paso por el que
‫pasa la solicitud mientras se procesa.
‫Y el paso por el que pasan las
‫solicitudes, en este ejemplo, es simplemente que se le agregan los datos del cuerpo.
‫Por lo tanto, se agrega al objeto de solicitud mediante
‫el uso de este middleware.
‫Usamos la aplicación. utilizar para utilizar middleware como este.
‫Y nuevamente, hablaremos mucho más sobre
‫middleware un poco más adelante en esta sección.
‫Por ahora, sepa que así es como usamos el middleware.
‫Todos los detalles seguirán más tarde.
‫Entonces, por ahora, solo para comenzar,
‫quiero mostrarle los datos del cuerpo en la consola, solo
‫para verificar que realmente funcione, así que req. cuerpo.
‫Nuevamente, body es la propiedad
‫que estará disponible en la solicitud, porque
‫usamos ese middleware hace un par de momentos.
‫Entonces queremos registrar [req. body] a la consola
‫y luego también debemos enviar una respuesta.
‫Entonces res. enviar y por ahora solo un marcador de posición aquí.
‫Simplemente 'Hecho' bien.
‫Por lo tanto,
‫siempre debemos enviar algo para finalizar
‫el llamado ciclo de solicitud / respuesta, del cual, nuevamente, aprenderemos
‫un poco más más adelante en esta sección.
‫Así que ahora probemos
‫esto y creemos una nueva solicitud para la publicación.
‫Ahora, aquí en cartero, podemos hacer
‫algo realmente bueno que es guardar todas estas solicitudes.
‫Empezaré por crear una
‫nueva colección, a la que llamaré Natours.
‫Nueva colección.
‫Ahora guardaré esta solicitud dentro de esa colección.
‫Así que este es Get all the Tours.
‫Ponlo en Natours y ahorra.
‫Así que ahora tenemos nuestras solicitudes Get aquí mismo.
‫Bueno, copiemos este aquí mismo, creemos
‫uno nuevo.
‫Así que esta es una solicitud de publicación.
‫Antes de hacerlo,
‫también lo guardaré en esta colección.
‫Así que crea un nuevo recorrido.
‫Aquí en el lado izquierdo, ahora tenemos nuestras dos solicitudes.
‫Especifiquemos ahora nuestro cuerpo aquí, de modo que los
‫datos que básicamente queremos enviar al servidor.
‫Venimos aquí a Body, y hay diferentes formas de hacerlo
‫ahora, pero la más fácil es
‫simplemente decir, Raw y luego Application JSON.
‫Todo lo que tenemos que hacer aquí es básicamente especificar algo de
‫JSON, y eso luego se transmitirá al servidor.
‫Entonces, lo primero que queremos especificar es
‫el nombre del Tour,
‫y recuerde que en JSON, todo debe estar entre
‫comillas y en realidad comillas dobles, no solo entre comillas.
‫Permítanme llamar a este Tour
‫de prueba, y echemos un vistazo a qué más tenemos en los datos del recorrido.
‫Así que tenemos el nombre, tenemos la duración,
‫y pongamos también la dificultad.
‫Así que no voy a especificar todos estos
‫porque eso lleva demasiado tiempo.
‫Digamos que la duración es
‫de 10 días y la dificultad es
‫fácil.
‫Eso como nuestro cuerpo será transmitido al servidor.
‫Así que eso está probado ahora, presionando enviar y aquí
‫obtenemos nuestra respuesta, que está lista, recuerde.
‫Aquí está la respuesta que le enviamos, así hecho.
‫Y ves que aquí abajo en nuestra
‫consola, ahora tenemos un objeto que
‫es básicamente el JSON que enviamos a nuestro cuerpo, ¿verdad?
‫¡Tan perfecto que funciona!
‫Ya no es JSON, como puede ver.
‫Es realmente un objeto de JavaScript.
‫Solo para mostrarle que
‫realmente necesitábamos middleware, comentemos este.
‫Envialo de nuevo.
‫Ahora ya no tengo la solicitud. cuerpo, verdad?
‫Por eso ahora no está definido, porque ya no existe.
‫Déjelo guardar, envíe nuestra
‫solicitud nuevamente, y ahora está de regreso.
‫Tenemos nuestra ruta de
‫publicación configurada, está funcionando ahora y también tenemos acceso al cuerpo, por
‫lo que lo que queremos hacer ahora es
‫conservar esos datos en este archivo JSON simple de recorrido.
‫De hecho, vamos a modificar este archivo para que los datos
‫se guarden en nuestra base de datos ficticia aquí.
‫Este archivo JSON en este momento funciona como
‫nuestra base de datos ficticia.
‫Así que ahora ocupémonos de eso.
‫Voy a seguir adelante y comentar esto.
‫Entonces empecemos.
‫Lo primero que debemos
‫hacer es averiguar la identificación del nuevo objeto.
‫Recuerde, nuevamente en la conferencia
‫sobre las API REST, es que cuando creamos un nuevo objeto,
‫nunca especificamos la identificación del objeto.
‫La base de datos generalmente se encarga de eso.
‫Un nuevo objeto generalmente obtiene automáticamente su nueva identificación.
‫Bueno, en este caso, no tenemos ninguna base de datos, así que
‫lo que vamos a hacer es simplemente tomar
‫la identificación del último objeto y luego agregar +1 a eso.
‫Hagámoslo muy rápido, y eso es solo
‫JavaScript básico.
‫Tan nuevoId son giras, ¿verdad?
‫Recuerda que tours, ya tenemos los datos
‫en esta variable tours.
‫Así que esa es una
‫matriz de todos los objetos de recorrido, por lo que
‫queremos obtener el último, que es recorridos. length - 1, luego la
‫propiedad id de eso y agregamos + 1.
‫Entonces esa es la nueva identificación.
‫A continuación, creamos un nuevo
‫recorrido, y ese recorrido
‫será básicamente el cuerpo que enviamos más la nueva identificación que acabamos de crear.
‫Entonces podemos usar object. asignar, que básicamente nos
‫permite crear un
‫nuevo objeto fusionando dos objetos existentes.
‫Entonces, el
‫primer objeto será id =
‫newId, y luego queremos
‫request. cuerpo.
‫También podríamos haber hecho req. cuerpo. id = newId,
‫pero no quería mutar el objeto del cuerpo original.
‫Lo dejé así.
‫Esa es la nueva gira, y
‫ahora lo que queremos hacer es llevar esta gira al conjunto de recorridos, ¿verdad?
‫Entonces, recorridos, es la variedad de los nueve recorridos
‫que tenemos en este momento.
‫Decimos empujar y empujar la nueva gira allí.
‫Esa es la matriz que ahora tiene el nuevo recorrido, pero, por
‫supuesto, ahora tenemos que persistir en el archivo.
‫De nuevo, eso es bastante fácil para ti en
‫este punto, así que usa fs. escribir archivo.
‫Entonces, ¿cuál deberíamos usar?
‫writeFile o writeFileSync?
‫La respuesta es muy simple.
‫Estamos dentro de una función de devolución de llamada, que
‫se ejecutará en el ciclo de eventos.
‫Nunca, nunca podremos bloquear el ciclo de eventos.
‫Lo que vamos a hacer es
‫usar writeFile y no sincronizar en este.
‫Queremos pasar una función de devolución de
‫llamada que se procesará en segundo plano y,
‫tan pronto como esté lista, pondrá su evento
‫en una de las
‫colas de bucle de eventos, que luego se manejará tan pronto como el bucle
‫de eventos pasa esa fase.
‫¿Recuerdas eso de la conferencia Event Loop?
‫De todos modos, obtengamos el nombre
‫del archivo desde aquí, porque realmente anularemos este archivo
‫para que cuando reiniciemos este
‫servidor, esté allí.
‫Entonces,
‫¿dónde? Aquí mismo.
‫Entonces ese es el archivo en el que queremos escribir.
‫Los datos que queremos escribir, que son tours, y luego
‫nuestra función call-back, que en este caso
‫solo tiene el error.
‫Aquí acabo de notar
‫que también necesitamos secuenciar este objeto, ¿verdad?
‫Queremos json en este archivo
‫JSON, y este en este momento es
‫solo un objeto JavaScript normal y simple, por lo que debemos convertirlo.
‫Pero eso es nuevamente simple, ya lo hice.
‫JSON. stringify del objeto.
‫¿Qué queremos hacer tan pronto como se escriba el archivo?
‫Bueno, lo que solemos hacer es enviar el objeto recién
‫creado como respuesta.
‫Vamos a hacer eso.
‫Entonces respuesta,
‫y luego, como siempre, comenzamos especificando el código de estado.
‫En este caso, no será un 200, sino un 201.
‫Entonces 201 que significa creado.
‫200 significa bien, 201 significa
‫creado, que es exactamente lo que sucedió aquí.
‫Creamos un nuevo recurso en un servidor.
‫Entonces JSON, y sigue agregando este mensaje aquí.
‫El estado es nuevamente el éxito.
‫No estoy usando la propiedad de resultados
‫aquí, que teníamos antes, porque ahora solo estoy enviando un resultado.
‫Los datos son nuestro sobre aquí.
‫Tour es nuevo tour.
‫¡Eso es todo!
‫Guárdelo aquí,
‫y así formatee, o codifique un poco.
‫Agreguemos más espacio aquí.
‫Creo que estamos listos para intentarlo ahora.
‫De hecho, podemos crear un nuevo recorrido utilizando estos datos aquí.
‫Así que ajuste este Tour de prueba, y
‫con estos datos, esperemos.
‫¿Que pasó aquí?
‫Veamos, está bien.
‫Tenemos un problema de que enviamos una respuesta dos veces básicamente.
‫Entonces enviamos una respuesta con JSON
‫y luego nuevamente con. enviar.
‫Eso no está permitido.
‫En realidad, es por eso que obtenemos este error aquí.
‫Así que es realmente bueno que haya sucedido aquí, para que sepa
‫lo que significa este error estándar aquí.
‫HTTP_HEADERS_SENT no puede establecer encabezados después de
‫que se envían al cliente.
‫Eso sucede cuando intentas enviar dos respuestas.
‫Necesitamos deshacernos de eso.
‫Sí, ese fue el único error que tuvimos.
‫Eso debería solucionarlo ahora.
‫Darle una oportunidad.
‫Y de hecho, aquí vamos.
‫Entonces tenemos nuestra identificación de
‫10, que nuestro código creó para nosotros, y luego el recorrido completo,
‫que son exactamente los datos que enviamos como un cuerpo en nuestra solicitud.
‫Ahora bien, la cuestión es que cuando tengamos
‫todos los recorridos aquí, todavía no aparecerán.
‫Si bajamos aquí, en realidad
‫ya está aquí.
‫Tenemos el de antes, así que cuando tuvimos ese
‫error, en realidad también creó este tour aquí.
‫Luego, por supuesto, el tour que creamos con el id de 10.
‫Así que este tour aquí es exactamente este
‫que se creó ahora mismo.
‫Si lo hacemos ahora, Test Tour 2, con la duración de tan solo 5.
‫Probemos este, y si consigo todos los recorridos, entonces eso también
‫se muestra aquí.
‫Dije al principio que no funcionaría, por lo que no aparecería de
‫inmediato, porque esto
‫solo funciona si reiniciamos el servidor.
‫Este archivo, el tour-simple.
‫json de donde provienen nuestros recorridos,
‫solo se lee al principio cuando iniciamos el servidor.
‫Ahora bien, cada vez que guardamos algo en este archivo
‫JSON, también se recargará el servidor.
‫Déjame demostrarte eso, así que si presiono ahora guardar,
‫mira lo que sucede aquí abajo.
‫Así que lo guardo, y para que vea
‫que aquí abajo reinició el servidor.
‫También formateó el código, porque era más bonito.
‫Pero lo que importa aquí, es que este código actualizado.
‫Es por eso que cada vez que guardamos algo
‫aquí con nuestra API, este
‫volverá a cargar inmediatamente el servidor y volverá a cargar
‫el contenido del archivo en los recorridos, y luego podremos leerlo de inmediato.
‫Es por eso que
‫tenemos acceso inmediato a todos los tours recién creados.
‫¿Tener sentido?
‫Bueno, si no, no
‫dude en hacer sus preguntas y, por supuesto, en la sección de preguntas y respuestas, ¿verdad?