La segunda parte de este ejercicio trata de
las diversas operaciones get put post y delete en sub-documentos dentro del documento.
Como vimos en el ejemplo de platos,
vimos que los comentarios se incluyen dentro del plato en sí como un sub-documento,
en la forma en que definimos tanto el esquema de comentario como el esquema de plato,
y luego definimos el modelo de plato incluyendo el esquema de comentario
en el esquema de plato como una matriz de comentarios.
Y vimos en el ejercicio anterior cómo los comentarios están encerrados dentro de
una matriz en forma de matriz de documentos dentro de cada documento plato.
Entonces, ¿cómo hacemos modificaciones a los propios comentarios?
¿ Cómo obtenemos toda la lista de comentarios para un plato?
¿ Cómo modificamos un comentario específico en el plato y así sucesivamente?
Así que esto es lo que veremos acerca de cómo
apoyarlos usando las diversas operaciones get put post y eliminar en
los platos plato slash plato ID slash comentarios y los platos
slash dish id slash slash comentarios slash comentario ID API REST puntos finales.
Para empezar en este ejercicio, de
nuevo, volviendo al router de plato,
ya han visto cómo manejamos el extremo de barra y el extremo de ID de plato de barra.
Ahora, gran parte de este trabajo que hacemos aquí ya es útil para nosotros,
así que lo que voy a hacer es copiar este código,
y luego editaremos ese código apropiadamente para manejar los comentarios y el ID del comentario.
Así que voy a copiar todo este código que tenemos
aquí tanto para la barra como para la identificación del plato dorado de barra,
y luego lo pegaremos justo debajo aquí de nuevo.
Y luego entraremos y modificaremos cada uno de ellos.
Así que hemos visto que si miras hacia arriba,
el primero es manejar la barra que se montará en el extremo de los platos de barra.
Y el siguiente es manejar la identificación del plato de corte.
Por lo tanto, el tercero debería estar manejando los comentarios de la barra de identificación del plato de barra.
Así que yendo aquí,
esta ruta del enrutador de tercer plato sería slash Dish ID slash comentarios.
Y luego el último, por supuesto,
sería slash dish ID slash
comentarios y luego recortar dos puntos ID de comentario.
Así que ahora que hemos actualizado estas rutas aquí,
ahora el siguiente paso es entrar y arreglar
el código en la publicación get put y eliminar las operaciones aquí.
Así que vamos a empezar con el punto final de los comentarios de ID de barra diagonal.
Por lo tanto, en caso de que el plato slash ID slash comentarios punto final, por
lo que vamos a hacer platos encontrar pero en lugar de decir
platos encontrar, vamos a hacer platos
encontrar por ID y así encontraremos el plato específico que estamos buscando.
Así que aquí, vamos a buscar ese ID de plato de params req,
por lo que primero vamos a buscar el plato,
y por lo que esto devolverá un plato específico.
Entonces, cuando devuelve ese plato específico aquí,
entonces lo que verificarán dentro de aquí
es que si el plato no es igual a nulo.
Es muy posible que el plato no exista,
así que si buscamos un plato específico con una identificación de plato, es
posible que ese plato no exista, por
lo que debemos preocuparnos por manejar esa situación particular.
Así que vamos a manejar esa parte dentro de aquí,
y así si no es nulo entonces eso significa que el plato existe.
Así que voy a cortar esto y luego pegarlo allí.
Y luego en este caso,
ya que el plato no es nulo,
por lo que devolveremos el código de estado y el encabezado del conjunto y
luego esto aquí vamos
a devolver los comentarios del plato, porque se nos pide que sólo devuelva los comentarios para ese plato en particular, así que vamos a decir:
«Los platos encuentran por ID,
luego req ID del plato parámetros y luego plato.»
Y entonces devolveremos los comentarios del plato aquí.
De lo contrario, esta es la parte más.
Entonces, lo que significa que el plato no existe.
Entonces, en este caso,
construiríamos un error aquí diciendo nuevos errores y luego diremos
dish req params dish ID no encontrado.
Así que este plato en particular no fue encontrado,
por lo que obviamente no podremos devolver los comentarios para el plato no existente.
Entonces, en este caso,
por lo que vamos a crear un nuevo objeto de error y luego vamos
a establecer el estado en el objeto de error en 404.
Una vez más, esto es 404 no encontrado,
y luego vamos a volver siguiente error.
Ahora, ¿por qué hacemos esto?
Porque si devuelve esto como un error, como recordará,
esto será manejado por su archivo app.js, por
lo que en el archivo app.js,
justo en la parte inferior aquí,
tenemos el controlador de errores aquí.
Entonces, cuando llegue aquí,
esto establecerá el resto o estado en estado de punto de error,
que habíamos establecido en 404,
por lo que eso es lo que se devolverá,
y luego simplemente tomará ese error y luego representará ese error aquí.
Entonces eso se encargará de renderizar los errores.
Así que esto devolverá el mensaje de error a nuestro cliente.
Eso es lo que estamos invocando aquí,
así que si el plato no existe,
solo vamos a devolver ese error aquí desde la operación get.
Ahora, para la publicación en caso de publicación,
estamos esperando que se les
devuelva una identificación de plato y luego vamos a buscar el plato,
y luego vamos a tomar el conjunto de comentarios
del cuerpo y luego empujarlo en el plato allí.
Así que vamos a decir platos, de nuevo, aquí,
tendremos que hacer el hallazgo por id porque estamos buscando el plato específico aquí.
Así que para el post, diremos que el plato encuentre por identificación y luego plato,
y así dentro de aquí,
si el plato existe,
entonces manejaremos el plato apropiadamente.
Si no, entonces tendremos que enviar el mensaje de error.
Así que permítanme copiar esta parte del get y entonces,
vamos a reemplazar esto aquí.
Así que, obviamente, si el plato no existe,
entonces vamos a devolver este error aquí,
pero si el plato existe, en ese caso,
devolveremos el código de estado 200 set header.
Pero antes de pasar de nuevo el valor,
lo que voy a hacer es decir comentarios de plato,
por lo que estamos publicando un nuevo conjunto de comentarios para el plato.
Así que vamos a decir que los comentarios del plato empujan el cuerpo req.
Debido a que el cuerpo del mensaje contiene todos los comentarios que deben ser empujados aquí,
y luego, vamos a decir, «Dish guardar».
Y así, si el guardado regresa con éxito con el plato aquí,
entonces enviaremos el plato actualizado desde aquí.
Así que esta parte donde estamos construyendo el código de estado,
lo haremos dentro aquí y luego enviaremos la parte de atrás el
Res.json y el plato que obtuvimos aquí.
Entonces, lo que estamos haciendo es que estamos salvando el plato aquí.
Primero estamos empujando los comentarios en el plato allí,
el nuevo conjunto de comentarios en el plato aquí,
y luego estamos guardando el plato actualizado aquí.
Luego, después de guardar,
vamos a devolver el plato actualizado al usuario aquí.
Entonces, si hay un error,
entonces manejaremos el error tal como lo hemos hecho aquí.
Si el plato no existe, por supuesto,
vamos a devolver el error diciendo que el plato no existe.
Por lo tanto, esto es para el post.
La operación PUT, por supuesto,
no es compatible con los platos.
Por lo tanto, en este caso,
estamos tratando de realizar la operación PUT
en los platos, req.Params.dishid/comentarios.
Por lo tanto, esto no está permitido.
Por lo tanto, eso es lo que estamos diciendo para la operación PUT.
Para la operación de eliminación,
lo que haremos es primero encontrar el plato.
Entonces, diremos dish.FindbyId.
Por lo tanto, eliminar significa que estamos eliminando todos los comentarios del plato,
no el plato en sí,
pero estamos eliminando todos los comentarios del plato.
Entonces, en este caso,
lo que terminaríamos haciendo es el siguiente: así que si el plato no es nulo,
recuerde que tenemos que manejarlo diciendo luego plato.
Si el plato no es
nulo, eliminaríamos todos los comentarios del plato.
Entonces, voy a copiar ese código y luego pegarlo aquí,
y luego editaremos este código, luego eliminaremos.
Veremos si el plato no es nulo,
entonces devolverán el plato aquí.
Por lo tanto, si el plato no es nulo,
el wat que manejaríamos esto es el siguiente.
Por lo tanto, tendremos que entrar y eliminar cada uno de los comentarios.
Entonces, diremos para (var i =
(dish.comments.length -1) i>= 0; i—).
Por lo tanto, estamos literalmente entrando y eliminando cada comentario.
Por lo tanto, diremos
dish.comments.id (dish.comments [i]. _id).
Diremos que elimines.
Por lo tanto, vamos a quitar cada uno de los platos,
uno debajo de cada uno de los comentarios uno por uno.
Por lo tanto, esto es lo que haremos con los comentarios.
Luego, una vez que hayamos eliminado todos los comentarios para el plato,
entonces tendremos que guardar el plato y luego enviar de vuelta.
Entonces, antes también cuando modificamos el plato,
esto es lo que hicimos aquí.
Entonces, voy a copiar esta parte,
y luego entrar aquí,
y luego decir plato.save,
entonces devolveremos el plato
aquí para indicar el plato actualizado que se devuelve aquí.
Entonces, así es como eliminaremos los comentarios.
Entonces, aquí vamos a entrar,
ahora no hay una manera fácil de extraer literalmente
todos los comentarios de la matriz cuando tiene un sub-documento.
Por lo tanto, tienes que entrar y eliminar cada subdocumento uno por uno.
Entonces, eso es lo que estoy haciendo en este bucle for aquí.
Entonces, estoy diciendo para (var i = dish.comments.length).
Por lo tanto, estoy mirando la matriz de comentarios y luego comenzando desde
el último comentario en esa matriz hasta el primer comentario,
voy a entrar y luego eliminar comentario por comentario aquí usando
la operación de eliminación en el subdocumento.
Entonces, la forma en que accederemos a un subdocumento es diciendo
plato y luego comentarios es el nombre del campo y luego digo id aquí.
Entonces, así es como accede a un subdocumento,
y dentro de aquí especificará el id de los subdocumentos a los que está tratando de acceder. Por lo
tanto, todo esto le dará acceso al subdocumento,
y luego llamamos al método remove en el subdocumento,
y para que el subdocumento se elimine de la matriz de subdocumentos.
Luego, después de eso, después de haber eliminado todos los comentarios,
guardaré los cambios y eso es todo.
Por lo tanto, todos mis comentarios se eliminarán de entonces plato.
Ahora, vamos a tratar con el siguiente punto final que es DishidComments/:CommentID.
Entonces, en este caso,
comenzaremos por localizar primero el plato y luego después de localizar el plato,
entonces tenemos que asegurarnos de que el plato existe,
y luego tratar con el plato.
Por lo tanto, voy a borrar esta parte,
y luego vamos a decir que vamos a copiar esta parte del git que teníamos antes
porque tenemos que ser capaces de lidiar con la situación en la
que el plato no existe o el plato existe pero los comentarios no existen,
o el plato en sí no existe.
Por lo tanto, hay tres condiciones que necesito probar.
Por lo tanto, diremos si (plato! =
null && dish.comments.id (req.params.commentID)! =
nulo, lo que significa que el plato en sí existe y también los comentarios existen en el plato,
sólo entonces podemos enviar de vuelta un comentario específico que se ha solicitado.
Entonces, en ese caso,
diremos que StatusCode es 200, la aplicación SetHeader json,
y luego aquí enviaremos dish.comments,
y estamos enviando de vuelta este comentario en particular.
Por lo tanto, ese es el comentario específico que estamos enviando max.
Por lo tanto, esto nos permitirá recuperar un comentario específico del conjunto de comentarios.
Ahora, diremos otra cosa si plato igual a nulo.
Así que los platos nulos,
entonces por supuesto tendremos que indicar que el plato no existe y
la última condición es si el comentario en sí es nulo.
Por lo tanto, en ese caso también tengo que indicar que el comentario en sí no existe,
ese ID de comentario particular no existe, así que en ese caso,
diré que el nuevo
comentario de error req.params.commentid no encontrado.
Entonces, tres condiciones.
Primero, tienes que asegurarte primero de que el plato existe y los comentarios del plato existen,
si lo hacen entonces puedo devolver el comentario específico,
si no, si el plato en sí no existe en el lado del servidor en la base de datos,
entonces indicaré que el plato no existe, pero si
el plato existe pero el comentario no existe,
entonces enviaré el mensaje diciendo que el comentario no existe.
Por lo tanto, observe que tienen que manejar todas las condiciones posibles aquí para el GET.
Para la POST, por supuesto,
la operación de publicación no es compatible con este extremo,
por lo que diremos
comentarios slash req.params.commentID.
Por lo tanto, la operación POST no es compatible con este ID de comentario. ¿Y ahora qué hay de PUT?
PUT es un caso más interesante aquí.
Por lo tanto, de nuevo incluso para poner,
tengo que manejar todas estas condiciones posibles,
así que voy a mirar esto y decir, de acuerdo para esto,
déjame copiar todo este código porque tenemos que manejar
todas estas posibilidades y luego te diré exactamente cómo manejamos el caso PUT aquí.
Entonces, en el caso de
PUT, primero por supuesto tenemos que localizar la carnicería.
Entonces dirán que los platos encuentran por Id req param Id,
entonces si el plato existe y el comentario en sí existe,
entonces sé que puedo actualizar el comentario.
De lo contrario, estas dos condiciones obviamente tienen que ser atendidas,
ese comentario no existe o el plato no existe.
Estos dos ya están manejados por ese caso.
Ahora, esta es la situación especial que tenemos.
Entonces, si el plato existe y el comentario específico que estoy buscando también existe,
entonces lo que sé es que en el cuerpo del mensaje,
se especifica la actualización para el comentario.
Así que necesito actualizar eso.
Entonces, en algún lugar aquí hago modificaciones,
hago un plato guardado aquí,
así que voy a entrar y copiar un poco de este código desde aquí,
por supuesto, esto no es lo correcto, pero solo necesito una parte del código desde allí,
así que entraré en el PUT.
Déjame pegarlo en su lugar aquí y
luego te diré exactamente cómo van a manejar esto.
Porque necesito que el plato guarde parte.
Entonces, ¿cómo manejamos la actualización de un comentario específico?
Así que para la actualización de un comentario específico,
lo que sabemos es que este comentario necesita ser actualizado,
por lo que sabemos que el plato existe y el comentario en sí existe.
Quiero actualizar los campos de la actual.
Ahora, si ya existe un comentario, entonces no quiero
permitir que el usuario cambie el autor del comentario,
el autor debe conservarlo.
Los únicos dos campos que permitiría que el usuario actualice es la calificación.
Entonces, dentro del cuerpo del mensaje PUT entrante,
puedo incluir
la calificación actualizada
o el comentario actualizado.
Estas son las únicas dos cosas que permitiré que el usuario cambie.
Así que si el si la propiedad de calificación es cuerpo indirecto para llamar que
el cuerpo contendrá la actualización que estamos tratando de hacerlo en este caso vamos a decir plato.
Así que diremos comentarios de platos,
así que déjame copiar esta parte.
Comentario plato Id.
Ahora bien, esta es una forma simple de manejar este problema aquí.
Debido a que no hay una forma
específica de actualizar un comentario específico que está en un subdocumento,
no hay un método específico para hacerlo.
Así que esta es la solución que encontré que parece funcionar para nosotros,
así que diremos comentarios de plato req parámetro comentario calificación Id igual a req body.rating.
Así que actualizaré la calificación.
Del mismo modo, si el comentario existe allí,
entonces diré req comment Id comment req body comment.
Entonces, así es como voy a actualizar la calificación y el comentario,
y una vez digo acerca de la calificación actualizada y el comentario,
y van a guardar el plato,
y luego una vez que guarde el plato, entonces voy a enviar de vuelta la respuesta.
Por lo tanto, tenga en cuenta que esta es la única manera que encontré que es bastante
fácil de actualizar un subdocumento incrustado dentro de un documento de Mangoose.
No hay ninguna manera explícita que Mongoose admita para actualizar un documento incrustado.
Así que esta es la solución que encontré que nos permite llevar a cabo esta operación.
Ahora para la operación de eliminación.
Para la operación de eliminación, estamos eliminando solo un
comentario específico, así que tomaré esta información
del eliminador para todos los comentarios
y en lugar de eliminar todos los comentarios,
solo voy a eliminar un comentario específico.
Por lo tanto, déjame copiar eso de la eliminación.
Déjame pegarlo aquí y luego actualizaremos esto.
Por lo tanto, si estoy eliminando un comentario específico, entonces primero encontraré el plato.
Si el plato no es nulo,
recuerde que en esta situación tengo que manejar tanto el plato
no siendo nulo como el comentario no es nulo.
Por lo tanto, diré que si
dish no es igual a null y dish comments id parámetro no es igual a null,
entonces sé que tengo un comentario específico que quiero eliminar.
No estoy eliminando todos los comentarios,
solo estoy eliminando un comentario específico aquí.
Entonces, diré que los comentarios de plato id y luego eliminaré el comentario específico aquí que
es req.params.commentid y eliminaré
ese comentario en particular y luego guardaré el plato actualizado y luego continuaré con eso.
Ahora, la otra parte que necesito para manejar las dos situaciones.
Por lo tanto, permítanme copiar esta parte si el plato no es igual a nulo y
así sucesivamente y luego reemplace esto aquí.
Entonces, si el plato es nulo, entonces enviaré el error diciendo que el plato no existe.
Si el comentario es nulo, enviaré el error diciendo que el comentario no existe.
Así que, eso es todo,
esta es la actualización que estoy haciendo aquí.
Para eliminar un comentario específico,
primero me aseguraré de que el plato y el comentario
existan, luego eliminaré el comentario específico y luego guardaré
los cambios
en el plato y luego continuaré con el manejo del resto de los casos, eso es todo.
Vamos a guardar los cambios y luego ver cómo funciona esto. Al
ir a la terminal,
veo que el servidor MongoDB no está en funcionamiento, así que comencemos allí.
Asegúrese, por supuesto, de
que el servidor MongoDB está en funcionamiento,
también vamos a iniciar nuestro servidor express.
Una vez que su servidor express esté en funcionamiento,
lo que haremos es ahora mirar específicamente
los comentarios y luego realizar operaciones en los comentarios.
Por lo tanto, vamos al Cartero y
luego echa un vistazo a lo que tenemos en la base de datos y luego tratar de modificar los comentarios.
Así que, aquí estoy en Cartero,
así que permítanme primero conseguir los platos y ahora veo que los platos están todos vacíos.
Así que déjame publicar un plato en la lista de platos, así que déjame publicar un plato.
Recordemos que tenemos este plato ella,
así que en mi cartero ya había hecho eso para el ejercicio anterior.
Sólo voy a seleccionar eso y luego publicar ese plato y luego
ves que ese plato en particular ha sido publicado aquí, abajo aquí abajo.
Puedes ver que el plato ha sido creado justo allí.
Permítanme ahora copiar esa identificación de plato en particular y luego voy a
conseguir ese plato aquí.
Así que, ves que ese plato en particular existe aquí.
Primero, consigamos todos los comentarios.
Por lo tanto, si hago un conseguir en los comentarios que se nota que
todos los comentarios para ese plato en particular han sido devueltos.
Podemos hacer el post y la eliminación también.
Vamos a poner eso y obviamente no puedes hacer un puesto en la
espalda, así que te das cuenta de que la operación de puesta no funciona en eso.
Vamos a publicar un nuevo comentario.
Así que para publicar un nuevo comentario vamos a entrar en el cuerpo,
y luego déjame cortar todos estos y luego vamos a editar uno de
los comentarios y luego
tratar de publicar ese comentario.
Por lo tanto, diremos calificación tres y luego
diremos comentario de prueba, usuario de prueba.
Vamos a publicar este comentario.
Cuando publiques este comentario,
ves que el plato de actualización ha sido devuelto aquí y ves que dentro de
este plato ves que el nuevo comentario ha sido incluido allí.
Así que, vamos a copiar todo esto.
Ahora, trataremos de conseguir ese comentario en particular que acabamos de insertar.
Para ese comentario en particular, esta es la identificación de ese comentario.
Así que permítanme copiar la identificación de ese comentario específico.
Volviendo a Postman,
permítanme tratar de recuperar ese comentario específico haciendo una operación get.
Allí ve que ese comentario en particular ha sido recuperado aquí.
Ahora, si estás tratando de hacer una publicación sobre eso, eso no funcionará,
así que obviamente ves que la operación de publicación no está permitida en eso.
Vamos a hacer una operación de poner,
en ese comentario en particular.
Por lo tanto, si tuviera que poner operación en el cuerpo,
voy a decir comentario de prueba actualizado.
Por lo tanto, voy a actualizar el campo de comentarios de ese comentario.
Si estás diciendo que lo pongas, verás que para el comentario específico,
el comentario ahora se ha actualizado para reflejar el comentario de prueba actualizado.
Por lo tanto, verá que la operación de poner en el campo de comentarios también funciona correctamente.
Vamos a eliminar ese comentario,
para que pueda eliminar el comentario y luego cuando elimine el comentario
verá que ese comentario ha desaparecido de la lista de comentarios.
Por lo tanto, verá que la operación de eliminación también funciona.
Vamos a eliminar todos los comentarios.
Así que voy a entrar y borrar todos los comentarios.
A continuación, verá que todos los comentarios se han eliminado,
y así verá que el área de comentarios ahora está vacía.
Por lo tanto, ahora puede verlos todas
las operaciones de get, put, post
y delete en los platos, dishid/comments y los
puntos finales de la API REST funcionan como se esperaba.
Así que con esto completamos este ejercicio.
Así, en este ejercicio hemos completado la implementación de los platos de barra, el
punto final de la API REST y soportado hasta
permitirnos manipular un solo plato,
la colección de platos,
un solo comentario y también la colección de comentarios.
Este es un buen momento para que hagas una confirmación de git con el mensaje,
express, API REST con Mangoose parte dos.