Es hora de empezar en la cuarta y última asignación de este curso.
He diseñado esta tarea para que sea una consolidación
de todo lo que han aprendido en este curso.
Por lo tanto, esta asignación implicará enrutamiento usando el enrutador express.
Implicará el diseño de esquemas en el modelo,
para nuestro MongoDB y Mangoose,
y luego también verá brevemente la autenticación del usuario.
¿ Qué hacemos exactamente en esta tarea?
Esta asignación se basa en la capacidad de un usuario para
guardar y recuperar una lista de platos como sus platos favoritos en el lado del servidor.
Si habías tomado los cursos anteriores de esta especialización,
específicamente los cursos de desarrollo de aplicaciones móviles híbridas,
ya sea de script iónico o nativo,
has visto que hemos diseñado las apps para tener la capacidad de permitir al usuario
guardar platos en la lista de sus favoritos platos
y también recuperar platos de esa lista de sus platos favoritos.
Cuando implementamos eso en los cursos anteriores,
lo habíamos implementado usando almacenamiento local en el dispositivo específico.
En esta asignación, ampliará
el lado del servidor para poder admitir exactamente eso.
De esta forma, el usuario puede guardar su lista de platos favoritos en
el lado del servidor y acceder a esta lista desde
cualquier dispositivo desde el que iniciará sesión en su servidor.
Lo que esto significa es que necesitamos diseñar una nueva ruta para nuestro servidor,
que llamaremos como la ruta /favorites.
En esta ruta, tendremos que diseñar el router express para apoyar las
operaciones de get, post y delete en esta ruta y
también diseñar el esquema para almacenar los platos favoritos
y el modelo correspondiente de Mangosta y
conectar los dos juntos para que la información pueda ser guardada y recuperado de MongoDB.
También utilizaremos la población de mangosta con el fin de extraer la información
del modelo de usuario y del modelo de platos cuando
armemos esa lista de platos favoritos para nuestro usuario.
La información de platos favoritos que almacene no
contendrá ni la información del usuario ni la información del plato.
En su lugar, contendrá punteros a los documentos para el documento de plato y para
el documento de usuario y luego publicaremos esta información
cuando estemos enviando esta información en respuesta a una solicitud de get.
Veamos cómo implementamos
esta tarea final y también las diversas tareas en esta asignación final.
Para ayudarle a entender lo que se requiere en
la asignación final o lo que va a implementar en la asignación final,
permítanme demostrar lo que se espera que haga su servidor al final de esta asignación,
y luego enumeraré las tres tareas que necesita realizar en este asignación.
Para empezar, necesitamos un conjunto de platos ya en
el lado del servidor para que el usuario pueda marcar algunos de ellos como sus platos favoritos.
He seguido adelante y añadido en cuatro platos a mi lista de platos en el lado del servidor.
Ya sabes cómo hacer esto.
Usted tiene que iniciar sesión como administrador y luego publicar
esta información de plato en el lado del servidor uno por uno.
Para permitirle obtener la información de cada uno de estos platos,
ya le he proporcionado el archivo db.json que contiene
los documentos JSON correspondientes a cada uno de estos platos en los recursos de asignación.
Puede abrir eso, cortar y pegar información desde allí y luego
crear una lista de platos en el lado del servidor.
Aquí, verá que ya he realizado la operación get en el
localhost: 3000/platos y luego
verá que ya he obtenido la lista de platos aquí.
Lo que es importante para nosotros tener en cuenta es que cada plato tendrá su propia identificación de plato aquí.
Cuando necesite marcar cualquier plato como su favorito,
necesita acceso a la identificación del plato para cada uno de estos platos.
Puede copiar estos cuatro ID de plato y luego guardarlos para que cuando
realice las operaciones para agregar estos platos a la lista de platos,
entonces usted será capaz de usar este ID de plato.
Así que voy a copiar estos cuatro identificadores de plato y luego
guardarlos en un documento de texto para que pueda hacer uso de ellos.
Antes de poder agregar platos a mi lista de platos,
obviamente necesito iniciar sesión como usuario.
Permítanme seguir adelante e iniciar sesión como uno de los usuarios.
Para hacer eso, déjame hacer una publicación en el localhost: 3000/users/login.
Y en el cuerpo del mensaje,
permítanme escribir uno de los usuarios registrados.
No quiero iniciar sesión como administrador, sino como uno de los otros usuarios normales.
Así que déjame hacer este post a https://localhost:3443.
Ahora todas estas operaciones,
esto es mejor hacerlo en el extremo HTTPS en lugar del extremo HTTP.
Haremos una publicación en este extremo e iniciaremos sesión en nuestro servicio
, y en respuesta, debería poder obtener el token web JSON.
Así que hagamos una copia de este token web JSON porque necesitaremos esto para
realizar cualquiera de las operaciones para agregar platos a nuestra lista de favoritos.
Permítanme copiar este token y guardarlo en mi documento de texto.
Ahora, ¿cómo agrego un plato a mi lista de favoritos?
Para ello, el primer paso es que tenemos que
acceder al endpoint /favorites.
Si quieres agregar un plato específico a la lista de favoritos,
solo decimos /favorites y luego agregamos el ID del plato a la URL aquí.
Déjame pegar en un ID de plato que quiero agregar a mi lista de favoritos.
Aquí, he pegado en mi ID de plato a la lista de favoritos.
El cuerpo de este mensaje de host
no contendrá nada porque todo lo que necesito ya está en la URL.
Y para el encabezado,
necesito configurar el encabezado de autorización,
y en el encabezado de autorización,
necesito el token.
Así que déjame copiar el token aquí y luego en el encabezado de autorización,
digamos portador, y pegarlo en el encabezado de autorización.
También puede hacer lo mismo para obtener el token.
También puede hacer el inicio de sesión a través de Facebook y luego obtener el token web JSON.
He ilustrado para obtener el token web JSON usando
la autenticación local estándar usando el nombre de usuario y la contraseña,
pero no importa de qué manera obtuviste el token web JSON.
Siempre y cuando tenga el token web JSON,
debería poder realizar todas estas operaciones.
Permítanme realizar la operación de publicación en este punto final y recordar que este
es el ID de plato para el plato específico que quiero agregar a mi lista de favoritos.
Cuando publique en la lista de favoritos,
verá que mi servidor responderá con este documento aquí en el cuerpo de respuesta.
Ahora, examinemos este documento para ver qué contiene exactamente.
Este documento, como puede ver, contiene un ID,
pero obviamente debido a que se trata de un documento JSON,
además contiene un
campo aquí llamado usuario.
Ahora, ¿qué almacena este campo de usuario?
Este campo de usuario es el ID de objeto del usuario
correspondiente al que es esta lista particular de favoritos.
Y mira los platos.
Los platos son una variedad y es una variedad de identificadores de platos.
Y en este caso, acabo de agregar el primer plato a mi lista de favoritos. Por
lo tanto, es por eso que solo tengo un plato en la variedad de platos en mi lista de favoritos.
Por lo tanto, esto debería sugerirle inmediatamente cómo diseñar el esquema para sus favoritos.
Por lo tanto, los platos contienen los ID de objeto de cada uno de los platos,
y el usuario contiene el ID de objeto correspondiente al usuario.
Usted ya ha visto cómo uso
la información para hacer la población de la información cuando hago una operación get.
Ya lo hemos hecho con comentarios.
Por lo tanto, eso debería darle una gran pista sobre cómo diseñaría el esquema que contiene
al usuario y la variedad de platos en mi lista de platos aquí.
Ahora, hemos hecho el post sobre esto.
Vamos a conseguir la lista de favoritos.
Entonces, para obtener la lista de favoritos,
necesito realizar una operación get.
Ahora, para la operación get,
obviamente necesito también tener la información de autorización aquí porque
desea que un usuario pueda recuperar solo su lista de favoritos,
y ningún otro usuario puede recuperar la lista de favoritos para un usuario diferente.
Por lo tanto, esto es muy importante.
Por lo tanto, esto le sugiere que necesita
verificar la autenticidad del usuario incluso para la operación get.
Ahora, ¿cómo la post-operación
obtiene automáticamente este ID de objeto correspondiente al usuario?
Recuerde que cuando incluya el encabezado de autorización aquí,
desde el encabezado de autorización,
por la forma en que realice la autorización del usuario,
dirija esas propiedades de usuario ya cargadas en el objeto de solicitud.
Y ahí es donde obtendrá acceso al ID de objeto del usuario.
Por lo tanto, una pista más sobre cómo va a llenar esta información.
Por lo tanto, es por eso que observe que cuando
realicé la publicación, nunca especificé
el usuario porque la información del usuario debe
derivarse automáticamente de lo que hemos proporcionado aquí en el encabezado de autorización.
Entonces, una pista más sobre cómo irías a implementar esto. Por
lo tanto, por eso dije que esta tarea es una consolidación
de todos los temas que han explorado en este curso.
Ahora, yo no apoyo una operación de obtener en un ID plato específico.
No tiene sentido apoyar eso en los favoritos,
en un ID de plato específico.
En su lugar, podemos realizar una operación get en el host local 3443/favoritos.
Y luego realizamos la operación de obtención.
Notará inmediatamente que el documento que se le devuelve contiene
la información del usuario ya rellenada por la operación get aquí.
Por lo tanto, la información del usuario.
Entonces, en lugar del ID de
usuario allí, la información del usuario ya está presente allí.
Esto se hace a través de la población de Mongo.
Entonces, esa es otra gran pista sobre cómo se supone que debes implementar la operación get.
No solo se rellena la información del usuario.
Ahora, ¿por qué querría que se rellenara la información del usuario?
Porque eso puede ser útil cuando estoy mostrando información.
Esto puede no ser necesario,
pero lo estoy haciendo solo por el bien de la integridad
porque si está recuperando la lista de favoritos para un usuario en particular,
automáticamente sabe quién es el usuario,
y ese usuario en particular está iniciando sesión de todos modos.
Pero en caso de que desee la información del usuario,
puede realizar esta operación para obtener la información de ese usuario.
Por lo tanto, sólo para ilustrar que la población de Mongo puede ser utilizada,
he ilustrado no sólo que en la lista de platos aquí,
la información sobre cada plato ya está poblada en esta matriz.
Por lo tanto, si tiene un montón de platos,
la información de cada uno de esos platos debe rellenarse en esta matriz.
Por lo tanto, este es otro uso de la población de Mongo
que usted está viendo para llenar la información de los platos.
Solo por la forma en que configuras el esquema para tus favoritos,
esto debería ser automáticamente posible para ti usando
solo el relleno de puntos en la lista de platos aquí.
Así que, esa es la segunda parte.
Ahora que somos capaces de recuperar el método de obtener platos,
déjame mostrarte cómo puedes realizar una operación posterior donde puedes
agregar un montón de platos a tu lista de favoritos.
Ahora, volviendo a este post,
si necesita agregar no solo uno sino un conjunto de platos a su lista de favoritos,
ahora ¿por qué querría esto?
Tal vez en el lado del cliente puede tener un botón que al
hacer clic le permitirá marcar un conjunto de platos de la lista de platos,
y luego añadirlos de una sola vez en su lista de favoritos.
Por lo tanto, para apoyar ese tipo de operación,
es posible que desee permitir que se realice una publicación en los favoritos de barra.
Ahora, cuando la publicación se realiza en los favoritos de barra, de nuevo,
seguirá necesitando el encabezado de autorización.
Pero en el cuerpo del mensaje,
vamos a almacenar la lista de platos como una matriz de este formato.
Entonces, este es un documento JSON aquí,
así que déjame asegurarme de que en mi encabezado,
el tipo de contenido ya esté presente allí.
Ahora, este documento
contendrá una variedad de platos como este.
Por lo tanto, cada plato se identificará
diciendo subrayado ID colon,
y luego aquí tendrán la identificación del plato,
por lo que esto no sería más que una variedad de platos.
Por lo tanto, permítanme añadir dos platos a mi lista de favoritos aquí sólo para ilustrar el punto.
Así que, déjame pegar las identificaciones de un par de platos en esto.
Por lo tanto, cuando realiza una publicación en el host local 3443/favoritos,
así es como componer el cuerpo del mensaje de publicación aquí.
Por lo tanto, cada plato que desee agregar se incluirá en este formato aquí.
Ahora, cuando los incluya en este formato,
y luego publique
en ese lado del servidor, el servidor a cambio enviará de vuelta la lista actualizada de favoritos para usted.
Por lo tanto, cuando reciba la lista actualizada de favoritos desde el lado del servidor,
verá que la información del usuario ya está allí,
pero observe cómo los platos favoritos se almacenan en esta matriz de ID de objetos de plato.
Entonces, el primero que ya habíamos agregado en la operación anterior.
Así que los dos restantes,
acabamos de agregar a la lista de nuestros favoritos.
Por lo tanto, esos dos ID de objeto también se agregan a
mi matriz de platos en mi documento favorito aquí.
Así que, ahí lo tienes. Entonces, así es como se supone que debes realizar
la publicación de favoritos en el punto final de esta manera.
Ahora, vamos a realizar de nuevo una operación get en
los favoritos sólo para ver cuáles son las características de la operación get para nosotros.
Así que cuando realizamos la operación GET,
inmediatamente notará que en el documento de devolución de favoritos,
tiene la información del usuario allí,
y luego abajo aquí,
los platos no son más que una variedad de documentos Json aquí,
cada uno correspondiente a un plato.
Ahora esto es automáticamente cuidado por la
población de mangosta que hemos hecho en el lado del servidor.
Por lo tanto, toda esta información debe rellenarse automáticamente en el lado del servidor.
Así es como funcionan sus operaciones de publicación en los dos puntos finales.
Ahora déjame mostrarte cómo realizarías una operación DELETE.
Ahora para eliminar un plato específico.
Así que permítanme realizar una operación de eliminación en un extremo específico.
Así que volveremos a este punto final,
y luego permítanme copiar uno de estos,
y luego eliminaré uno de los platos.
Así que para realizar la operación de eliminación en uno
de los platos, por supuesto, como ves,
todavía no necesitamos el cuerpo,
y no necesitamos el contenido aquí.
Todo lo que tenemos que hacer es realizar una operación de eliminación en este extremo.
Así que aquí ves que estoy haciendo localhost: 3443/favorites/ y luego el ID del plato.
Y luego déjame publicar esto.
Así que cuando elimino un plato específico de mi lista de favoritos,
inmediatamente nota que
mi lista actualizada de favoritos se envía de vuelta al lado del cliente por el servidor.
Así que tienes al usuario aquí,
pero ten en cuenta que en la matriz de platos solo tengo dos platos ahora.
El que acabo de borrar ha desaparecido de esa lista de platos.
Así que si usted realiza un GET ahora,
su matriz de platos será continuamente a los platos allí dentro.
Ahora, supongamos que realizo un DELETE en los favoritos aquí.
Entonces, si realizo DELETE en el extremo de favoritos directamente,
entonces lo que va a hacer es eliminar todos mis favoritos y
también eliminar mi documento de favoritos por completo desde el lado del servidor.
Así que permítanme realizar esa operación de eliminación en el lado del servidor,
y luego devolverá el hecho de que ha eliminado este documento en particular,
por lo que solo devuelve este documento de todos modos.
Pero ahora si realizo una operación GET en mi lista de favoritos,
recuperaré un nulo allí.
Significa que no tengo este documento en el lado del servidor.
Entonces, el documento de favoritos se ha ido por completo,
cuando realizo la operación DELETE en la columna de host local tres de los favoritos anteriormente barra diagonal.
Ahora de nuevo, cuando añada un nuevo plato a mi lista de
favoritos, mi documento de favoritos se configurará de nuevo.
Eso está perfectamente bien para que operemos.
Así que con esta demostración le he mostrado
todas las diversas operaciones que necesita realizar en su lado del servidor.
Todas las diversas operaciones en los distintos extremos de ruta
que necesita realizar o implementar en el lado del servidor.
Ahora que ha visto
todas las diversas operaciones que el lado del servidor debe admitir en los favoritos de barra,
y los favoritos de barra,
puntos finales de ID de plato diagonal,
permítanme enumerar las tres tareas que necesita completar en esta asignación.
La primera tarea, por supuesto, es implementar el esquema y el modelo favoritos.
Esto lo implementará en la carpeta de modelos en un archivo llamado NodeJS favorito.
Allí implementará el esquema favorito.
Recuerde que el esquema favorito almacenará
la referencia al Id. de objeto de documento del usuario
y una matriz de Id. de objeto de documento de platos.
Esa es la gran pista sobre cómo se supone que debe
diseñar el esquema y el modelo para sus favoritos.
La segunda tarea de la asignación es implementar las
operaciones GET, POST y DELETE en el extremo de favoritos de barra diagonal.
GET le dará toda la lista de favoritos,
rellenado automáticamente por el poblado de Mongo,
el POST debe contener una lista de platos como se especifica
en el formato que acabo de demostrar a usted en el cuerpo del mensaje POST.
Y así un montón de platos se agregarán a su lista de favoritos,
y la operación DELETE en el extremo de favoritos barra
eliminará su documento de favoritos por completo desde el lado del servidor.
Ahora, si realiza una operación POST en el ID de plato de barra diagonal favorito,
entonces el plato en particular se agregará a su lista de favoritos.
Si su documento favorito no existe,
obviamente necesita crear ese documento favorito.
Entonces eso también es parte de esa operación POST.
Así que si en algún momento encuentra que el documento favorito no existe,
primero debe crear el documento favorito y
luego agregar este plato al documento favorito.
Por lo tanto, este es un punto importante a tener en cuenta también.
Cuando realiza una POST en el extremo de favoritos de barra diagonal,
si el documento favorito no existe,
debe crear un documento favorito y, a continuación, agregar los platos al documento favorito.
Si ya existe
, solo actualiza ese documento favorito.
Entonces, esta es una pista más sobre cómo se supone que debe implementar las operaciones POST.
Si realiza una operación DELETE en el ID de plato de barra de favoritos favoritos,
ese plato específico se eliminará de la lista de favoritos.
Ahora, al realizar las operaciones POST y DELETE,
debe asegurarse de que no agregará duplicados al ID del plato.
Entonces, antes de agregar un ID de objeto de plato a la lista de platos,
compruebe siempre si el ID del plato ya existe en la lista de platos.
Ahora es aquí donde puede usar el método de matriz indexOf para comprobar
si ya existe un ID de documento en una matriz de documentos.
Así que esa es otra gran pista sobre cómo vas a implementar esa parte.
Y la tercera tarea, por supuesto, es montar
el enrutador favorito en los puntos finales favoritos de barra mediante la actualización del archivo app.js.
El enrutador favorito en sí se implementará en
la carpeta de rutas en el archivo favoriterouter.js.
Así que con esto he descrito lo que
se supone que debes implementar en la cuarta y última tarea.
Y espero que esta tarea le ayude
a consolidar todo lo que ha aprendido en el curso,
desde el diseño del router express,
hasta hacer MongoDB y también el esquema y modelos de Mongo,
y también realizar la autenticación de usuario adecuada.
Y como he mencionado de nuevo,
solo un usuario autenticado obtendrá acceso a su lista de favoritos.
Incluso la operación GET sólo puede ser realizada por
un usuario autenticado en el extremo de favoritos de barra diagonal.
Y solo conseguirías los favoritos para ese usuario en particular.
No se puede permitir que un usuario diferente acceda a los favoritos de otro usuario.
De nuevo, eso también le dice cómo se supone que debe realizar
la autenticación en los diferentes puntos finales de ruta.
Con esto completo la descripción de las tareas en la cuarta asignación.
Diviértete completando esta tarea.