A segunda parte deste exercício lida com
os vários get put post e excluir operações em sub-documentos dentro do documento.
Como vimos no exemplo para pratos,
vimos que os comentários são incluídos dentro do próprio prato como um sub-documento,
na forma como definimos tanto o esquema de comentário quanto o esquema de prato,
e então definimos o modelo de prato, incluindo o esquema de comentário
no esquema prato como uma matriz de comentários.
E vimos no exercício anterior como os comentários são colocados dentro de
uma matriz na forma de uma matriz de documentos dentro de cada documento prato.
Então, como fazemos modificações nos próprios comentários?
Como obtemos toda a lista de comentários para um prato?
Como modificamos um comentário específico no prato e assim por diante?
Então, isso é o que vamos ver sobre como
apoiá-los usando os vários get put post e excluir operações sobre
os pratos pratos barra prato ID barra comentários e os pratos
barra prato ID barra comentários barra comentário barra comentário ID REST API endpoints.
Para começar este exercício,
novamente, voltando para o roteador de prato,
eles já viram como lidamos com o endpoint de barra e o endpoint de ID de prato de barra.
Agora, muito desse trabalho que fazemos aqui já é útil para nós,
então o que eu vou fazer é copiar esse código,
e então vamos editar esse código apropriadamente para lidar com os comentários e o ID do comentário.
Então eu vou copiar este código inteiro que temos
aqui tanto para a barra e a barra dourada ID prato,
e então vamos colá-lo logo abaixo aqui novamente.
E então entraremos e modificaremos cada um deles.
Então temos visto que se você olhar para trás,
o primeiro é lidar com a barra que será montado no ponto final de pratos de barra.
E o próximo é lidar com a identificação da placa.
Assim, o terceiro deve ser lidar com barra prato ID barra comentários.
Então indo para baixo aqui,
este terceiro prato rota roteador seria slash prato ID slash comentários.
E, em seguida, o último, é claro,
seria barra prato ID barra
comentários e, em seguida, barra dois pontos ID comentário.
Então, agora que atualizamos essas rotas aqui,
agora o próximo passo é entrar e corrigir
o código no get put post e excluir operações aqui.
Então, vamos começar com a barra prato ID barra comentário endpoint.
Então, no caso da barra ID barra comentários endpoint,
então vamos fazer pratos encontrar, mas em vez de dizer pratos encontrar,
vamos fazer pratos encontrar por
ID e assim vamos encontrar o prato específico que estamos procurando.
Então, aqui, vamos procurar que req params prato ID,
então vamos primeiro procurar o prato,
e assim isso irá retornar um prato específico.
Então, quando ele retorna esse prato específico aqui,
então o que eles vão verificar para dentro aqui
é que se prato não é igual a nulo.
É bem possível que o prato não exista, por
isso, se procurarmos um prato específico com uma identificação de prato,
esse prato pode não existir,
por isso temos de nos preocupar em lidar com essa situação em particular.
Então vamos lidar com essa parte dentro aqui,
e então se não é nulo, então isso significa que o prato existe.
Então eu vou cortar isso e depois colá-lo lá dentro.
E então, neste caso,
já que o prato não é nulo,
então vamos retornar o código de status e o cabeçalho do conjunto e, em
seguida, este aqui nós estaremos retornando comentários de prato,
porque nós somos convidados a apenas retornar os comentários para aquele prato em particular, então vamos dizer,
“Pratos encontrar por ID,
em seguida, req parâmetros ID prato e, em seguida, prato.”
E assim vamos retornar os comentários do prato aqui.
Caso contrário, então esta é a outra parte.
Então, o que significa que o prato não existe.
Então, neste caso,
nós construiria um erro aqui dizendo novos erros e, em seguida, vamos dizer
prato req params prato ID não encontrado.
Então este prato em particular não foi encontrado,
então, obviamente, não seremos capazes de retornar os comentários para o prato inexistente.
Então, neste caso,
então vamos criar um novo objeto de erro e, em seguida, vamos
definir o status no objeto de erro para 404.
Novamente, este é 404 não encontrado,
e então vamos retornar próximo erro.
Agora, por que fazemos isso?
Porque se você retornar isso como um erro, como você lembrará,
isso será tratado pelo seu arquivo app.js,
portanto, no arquivo app.js,
bem na parte inferior aqui,
temos o manipulador de erros aqui.
Então, quando ele vem aqui,
isso irá definir o resto ou status para status de ponto de erro,
que tínhamos definido como 404, de
modo que é o que será retornado,
e então ele vai simplesmente pegar esse erro e então renderizar esse erro aqui.
Então isso vai cuidar de renderizar os erros.
Então, isso retornará a mensagem de erro de volta ao nosso cliente.
Isso é o que estamos invocando aqui,
então se o prato não existe,
vamos apenas retornar esse erro aqui da operação get.
Agora, para o post em caso de post,
estamos esperando que eles seriam
devolvidos um ID prato e, em seguida, vamos olhar para o prato,
e então vamos tomar o conjunto de comentários
do corpo e, em seguida, empurrá-lo para o prato lá.
Então vamos dizer pratos, novamente, aqui,
teremos que fazer o achado por id porque estamos procurando o prato específico aqui.
Então, para o post, vamos dizer prato encontrar por ID, em seguida, prato,
e assim dentro aqui,
se o prato existe,
então vamos lidar com o prato adequadamente.
Caso contrário, teremos que enviar a mensagem de erro.
Então deixe-me copiar esta parte do “get “e então,
vamos substituir isto aqui.
Então, obviamente, se o prato não existe,
então nós vamos retornar este erro aqui,
mas se o prato existe, nesse caso,
vamos retornar o código de status 200 set header.
Mas antes de passar para trás o valor,
o que eu vou fazer é dizer comentários prato,
então estamos postando um novo conjunto de comentários para o prato.
Então, vamos dizer comentários prato empurrar corpo req.
Porque o corpo da mensagem contém todos os comentários que precisam ser empurrados aqui,
e então, vamos dizer, “Dish save”.
E então, se o salvamento retornar com sucesso com o prato aqui,
então enviaremos o prato atualizado a partir daqui.
Então, esta parte onde estamos construindo o código de status,
vamos fazer isso aqui dentro e então vamos enviar a
res.JSON de volta e o prato que obtivemos aqui.
Então, o que estamos fazendo é que estamos salvando o prato aqui.
Estamos primeiro empurrando os comentários para o prato lá,
o novo conjunto de comentários para o prato aqui,
e então estamos salvando o prato atualizado aqui.
Então, após o salvamento,
nós vamos estar devolvendo o prato atualizado de volta para o usuário aqui.
Então, se houver um erro,
então vamos lidar com o erro exatamente como fizemos aqui.
Se o prato não existir, é claro,
vamos retornar o erro dizendo que o prato não existe.
Então, isto é para o posto.
A operação PUT, é claro,
não é suportada em pratos.
Então, neste caso,
estamos tentando executar a operação PUT
nos pratos, req.params.dishid/comentários.
Então, isso não é permitido.
Então, é isso que estamos dizendo para a operação PUT.
Para a operação de exclusão,
o que faremos é primeiro encontrar o prato.
Então, vamos dizer dish.Findbyid.
Então, excluir significa que estamos removendo todos os comentários do prato,
não o próprio prato,
mas estamos removendo todos os comentários do prato.
Então, neste caso,
o que acabaríamos fazendo é a seguinte: então, se o prato não é nulo,
lembre-se que precisamos lidar com isso, dizendo então prato.
Se o prato não for nulo,
então removeremos todos os comentários do prato.
Então, eu vou copiar esse código e, em seguida, colá-lo aqui,
e, em seguida, vamos editar este código, em seguida, excluir.
Vamos ver se o prato não é nulo,
então eles vão retornar o prato aqui.
Então, se prato não é nulo,
o wat que iria lidar com isso é o seguinte.
Então, teremos que entrar e excluir cada um dos comentários.
Então, vamos dizer para (var i =
(dish.comments.length -1) i>= 0; i—).
Então, estamos literalmente entrando e removendo cada comentário.
Então, vamos dizer
dish.comments.id (dish.comments [i]. _id).
Vamos dizer remova.
Então, vamos remover cada um dos pratos,
um sob cada um dos comentários, um por um.
Então, isso é o que faremos com os comentários.
Então, uma vez que tenhamos removido todos os comentários para o prato,
então teremos que salvar o prato e depois enviar de volta.
Então, mais cedo também quando modificamos o prato,
isso é o que fizemos aqui.
Então, eu vou copiar esta parte,
e depois vir aqui,
e depois dizer dish.save,
então vamos devolver o prato
aqui para indicar o prato atualizado que está sendo devolvido aqui.
Então, é assim que vamos excluir os comentários.
Então, aqui estamos entrando,
agora não há nenhuma maneira fácil de literalmente retirar
todos os comentários da matriz quando você tem um subdocumento.
Então, você tem que entrar e excluir cada subdocumento um por um.
Então, isso é o que eu estou fazendo neste loop aqui.
Então, eu estou dizendo para (var i=dish.comments.length).
Então, eu estou olhando para a matriz de comentários e,
em seguida, começando a partir do último comentário nessa matriz todo o caminho para o primeiro comentário,
eu estou entrando e, em seguida, excluindo comentário por comentário aqui usando
a operação de remoção no subdocumento.
Então, a maneira que vamos acessar um subdocumento é dizendo
prato e, em seguida, comentários é o nome do campo e, em seguida, eu digo id aqui.
Então, é assim que você acessa um subdocumento,
e dentro daqui você especificará o id dos subdocumentos que você está tentando acessar.
Então, essa coisa toda lhe dará acesso ao subdocumento,
e então chamamos o método remove no subdocumento,
e assim que subdocumento será removido da matriz de subdocumentos.
Então, depois disso, depois de excluirmos todos os comentários,
vou salvar as alterações e é isso.
Então, todos os meus comentários serão excluídos de então prato.
Agora, vamos lidar com o próximo ponto final que é dishidComments/:commentid.
Então, neste caso,
vamos começar primeiro localizando o prato e depois de localizar o prato,
então temos que ter certeza de que o prato existe,
e depois lidar com o prato.
Então, eu vou excluir esta parte,
e então vamos dizer vamos copiar esta parte do git que tivemos anteriormente
porque precisamos ser capazes de lidar com a
situação em que o prato não existe ou o prato existe, mas os comentários não existem,
ou o prato em si não existe.
Então, há três condições que eu preciso testar.
Então, vamos dizer se (prato! =
null && dish.comments.id (req.params.commentID)! =
nulo, o que significa que o prato em si existe e também os comentários existem no prato,
só então podemos enviar de volta um comentário específico que foi solicitado.
Então, nesse caso,
vamos dizer StatusCode é 200, json aplicativo SetHeader
e, em seguida, aqui vamos enviar de volta dish.comments,
e estamos enviando de volta este comentário em particular.
Então, esse é o comentário específico que estamos enviando max.
Então, isso nos permitirá recuperar um comentário específico do conjunto de comentários.
Agora, vamos dizer outra coisa se prato igual a nulo.
Então os pratos nulos,
então, é claro, teremos que indicar que o prato não existe e
a última condição é se o comentário em si é nulo.
Então, nesse caso também eu tenho que indicar que o comentário em si não existe,
esse ID de comentário particular não existe, então, nesse caso,
eu direi novo
comentário de erro req.params.commentid não encontrado.
Então, três condições.
Primeiro, você tem que ter certeza primeiro que o prato existe e os comentários do prato existem,
se eles o fizerem, então eu posso enviar de volta o comentário específico
, se não, se o prato em si não existe no lado do servidor no banco de dados,
então eu vou indicar que o prato não existe, mas se
o prato existe, mas o comentário não existe,
então eu vou enviar de volta a mensagem dizendo que o comentário não existe.
Então, observe que eles têm que lidar com todas as condições possíveis aqui para o GET.
Para o POST, é claro,
a operação de postagem não é suportada neste endpoint,
então vamos dizer
comentários barra req.params.commentId.
Portanto, a operação POST não é suportada neste ID de comentário. E agora o PUT?
PUT é um caso mais interessante aqui.
Então, novamente, mesmo para colocar,
eu tenho que lidar com todas essas condições possíveis,
então eu vou olhar para isso e dizer, ok para isso,
deixe-me copiar todo esse código porque nós temos que lidar com
todas essas possibilidades e então eu vou te dizer exatamente como nós lidamos com o caso PUT aqui.
Então, no caso de PUT,
primeiro é claro que precisamos localizar a carnificina.
Então eles vão dizer pratos encontrar por Id req param Id,
em seguida, se o prato existe eo comentário em si existe,
então eu sei que eu posso atualizar o comentário.
Caso contrário, estas duas condições obviamente têm de ser atendidas,
esse comentário não existe ou o prato não existe.
Estes dois já são tratados por esse caso.
Agora, aqui está a situação especial que temos.
Então, se o prato existe e o comentário específico que eu estou procurando também existe,
então o que eu sei é que no corpo da mensagem,
a atualização para o comentário é especificada.
Então eu preciso atualizar isso.
Então, em algum lugar aqui
eu faço modificações, eu faço um prato salvar aqui,
então eu vou entrar e copiar um pouco deste código daqui, é
claro que isso não é a coisa certa, mas eu só preciso de uma parte do código de lá,
então eu vou entrar no PUT.
Deixe-me colá-lo no lugar aqui e
então eu vou te dizer exatamente como eles vão lidar com isso.
Porque eu preciso da parte de salvar prato.
Então, como lidamos com a atualização de um comentário específico?
Então, para a atualização de um comentário específico,
o que sabemos é que este comentário precisa ser atualizado,
então sabemos que o prato existe e o comentário em si existe.
Quero atualizar os campos da corrente.
Agora, se um comentário já existe, então eu não quero
permitir que o usuário altere o autor do comentário,
o autor deve ser mantido.
Os dois únicos campos que permitiria a atualização do usuário é a classificação.
Assim, dentro do corpo da mensagem PUT de entrada,
eu posso incluir
a classificação atualizada
ou o comentário atualizado.
Estas são as duas únicas coisas que permitirei que o usuário mude.
Então, se o se a propriedade de classificação é corpo indireto para chamar que
o corpo irá conter a atualização que estamos tentando fazê-lo neste caso, vamos dizer prato.
Então vamos dizer comentários prato,
então deixe-me apenas copiar esta parte.
Id comentário comentário prato.
Agora esta é uma maneira simples de lidar com esta questão aqui.
Como não há nenhuma maneira específica de atualizar
um comentário específico que está em um subdocumento,
não há nenhum método específico para fazer isso.
Então, esta é a solução que eu encontrei que parece funcionar para nós,
então vamos dizer comentários prato req parâmetro comentário classificação Id igual a req body.rating.
Então eu vou atualizar a classificação.
Da mesma forma, se o comentário existe lá,
então eu vou dizer req comentário Id comentário req corpo comentário.
Então, é assim que eu vou estar atualizando a classificação e o comentário,
e uma vez digo sobre atualizado a classificação e o comentário, e
eles vão salvar o prato,
e então uma vez que eu salvar o prato, em seguida, eu vou enviar de volta a resposta.
Então, note que esta é a única maneira que eu encontrei que é fácil o suficiente
para atualizar um subdocumento embutido dentro de um documento de Mangusto.
Não há nenhuma maneira explícita que o Mangoose suporta para atualizar um documento incorporado.
Então esta é a solução que eu encontrei que nos permite realizar esta operação.
Agora, para a operação de exclusão.
Para a operação de exclusão estamos excluindo apenas um
comentário específico, então eu vou tomar esta informação
do deleter para todos os comentários
e em vez de excluir todos os comentários
eu só vou ser excluir um comentário específico.
Então, deixe-me copiar isso do deletar.
Deixe-me colá-lo aqui e então atualizaremos isso.
Então, se eu estou excluindo um comentário específico então eu vou primeiro encontrar o prato.
Se o prato não é nulo,
lembre-se que nesta situação eu tenho que lidar tanto com o prato
não sendo nulo e também o comentário não ser nulo.
Então, eu vou dizer se
prato não igual a null e dish comentários id parâmetro não igual a null,
então eu sei que eu tenho um comentário específico que eu quero excluir.
Não estou excluindo todos os comentários,
estou excluindo apenas um comentário específico aqui.
Então, eu vou dizer prato comentários id e, em seguida, eu estou excluindo o comentário específico aqui que
é req.params.commentid e remover
esse comentário particular e, em seguida, eu vou salvar o prato atualizado e, em seguida, seguir em frente com isso.
Agora, a outra parte eu preciso para lidar com ambas as situações.
Então, deixe-me copiar esta parte senão prato não igual a nulo e
assim por diante e, em seguida, substituir este aqui.
Então, se o prato é nulo, então eu vou enviar de volta o erro dizendo que o prato não existe.
Se o comentário é nulo, em seguida, eu vou enviar de volta o erro dizendo comentário não existe.
Então, é isso,
esta é a atualização que estou fazendo aqui.
Para excluir um comentário específico,
eu primeiro vou garantir que o prato eo comentário
existem, então eu vou excluir o comentário específico e então eu vou salvar
as alterações para o prato e,
em seguida, continuar com o tratamento do resto dos casos, é isso.
Vamos salvar as alterações e, em seguida, olhar para como isso funciona.
Indo para o terminal,
vejo o servidor MongoDB não está funcionando, então vamos começar por aí.
Certifique-se, é claro, de
que o servidor MongoDB está funcionando,
vamos também iniciar o nosso servidor express.
Uma vez que seu servidor express está funcionando,
o que vamos fazer é agora olhar especificamente para
os comentários e, em seguida, executar operações sobre os comentários.
Então, vamos para o carteiro e, em
seguida, verificar o que temos no banco de dados e, em seguida, tentar modificar os comentários.
Então, aqui estou eu no Carteiro,
então deixe-me primeiro pegar os pratos e agora vejo que os pratos estão todos vazios.
Então deixe-me postar um prato para a lista de pratos então deixe-me postar um prato.
Lembre-se que temos este prato dela,
então no meu carteiro eu já tinha feito isso para o exercício anterior.
Eu só vou selecionar isso e, em seguida, postar esse prato e então você
vê que esse prato em particular foi postado aqui, abaixo aqui.
Você pode ver que o prato foi criado ali mesmo.
Deixe-me agora copiar esse ID prato particular e, em seguida, eu vou
agora obter esse prato aqui.
Então, você vê que esse prato em particular existe aqui.
Primeiro, vamos fazer todos os comentários.
Então, se eu fizer um get sobre os comentários que você percebe que
todos os comentários para esse prato particular foram devolvidos.
Podemos fazer o post e excluir também.
Vamos colocar isso e, obviamente, você não pode colocar de
volta, então você percebe que a operação de venda não funciona nisso.
Vamos postar um novo comentário.
Então, para postar um novo comentário, vamos para o corpo,
e então deixe-me cortar todos esses e, em seguida, vamos editar um
dos comentários e, em seguida,
tentar postar esse comentário.
Então, vamos dizer classificação três e, em seguida, vamos
dizer comentário teste, teste usuário.
Vamos postar este comentário.
Quando você postar este comentário,
você vê que o prato de atualização foi devolvido aqui e você vê que dentro
deste prato você vê que o novo comentário foi incluído lá.
Então, vamos copiar essa coisa toda.
Agora, vamos tentar obter esse comentário específico que acabamos de inserir.
Para esse comentário em particular este é o id desse comentário.
Então deixe-me copiar o id para esse comentário específico.
Voltando ao Carteiro,
deixe-me tentar recuperar esse comentário específico fazendo uma operação get.
Lá você vê que esse comentário em particular foi recuperado aqui.
Agora, se você está tentando fazer um post sobre isso, que não vai funcionar
então obviamente você vê que a operação pós-não é permitido sobre isso.
Vamos fazer uma operação de venda,
nesse comentário em particular.
Então, se eu fosse colocar a operação no corpo,
eu vou dizer comentário de teste atualizado.
Então, eu vou atualizar o campo de comentários desse comentário.
Se você está dizendo para colocar em que você vai ver que para o comentário específico,
o comentário foi agora atualizado para refletir o comentário de teste atualizado.
Então, você vê que a operação put no campo de comentários também funciona corretamente.
Vamos excluir esse comentário,
para que eu possa excluir o comentário e, em seguida, quando eu excluir o comentário você
verá que esse comentário desapareceu da lista de comentários.
Então, você vê que a operação de exclusão também funciona.
Vamos apagar todos os comentários.
Então eu vou entrar e apagar todos os comentários.
Então você vê que todos os comentários foram excluídos,
e assim você vê que a área de comentários está agora vazia.
Então, agora você pode vê-los todas as
operações de obter, colocar, postar e excluir sobre
os pratos/DISHID/comentários
e os pratos/Dishid/Comentários/Comentários/CommentID,
REST API todos funcionam como esperado.
Então, com isso, completamos este exercício.
Então, neste exercício, concluímos a implementação dos pratos de barra,
endpoint API REST e apoiado todo o caminho
até nos permitir manipular um único prato,
a coleção de pratos,
um único comentário e também a coleção de comentários.
Este é um bom momento para você fazer um git commit com a mensagem,
express, REST API com Mongoose parte dois.