‫Instrutor: Então você
‫já aprendeu como criar novos documentos no banco de dados.
‫Mas, nesta palestra, vou mostrar
‫a você uma maneira mais fácil e ainda melhor de fazer isso,
‫à medida que implementamos nosso manipulador de criação de tour.
‫Então, neste ponto, nossa
‫API basicamente não faz mais nada.
‫Não funciona mais
‫porque basicamente excluímos todas as funcionalidades que
‫tínhamos no último vídeo.
‫E fizemos isso para que nas próximas
‫duas aulas possamos reconstruí-lo usando um banco de dados real.
‫Ok, então basicamente construindo nossa API real.
‫E vamos começar implementando
‫a função createTour.
‫Mas lembre-se da função de manipulador que
‫é chamada assim que há uma solicitação de postagem
‫para o roteiro dos passeios.
‫Então é isso que temos aqui em tourRoutes.
‫Então, vamos colocar isso aqui.
‫Então, o que acabei de dizer é o seguinte.
‫Portanto, temos este checkBody aqui.
‫O que, na verdade,
‫é algo que também poderemos excluir.
‫Então, onde fica isso, na verdade?
‫checkBody certo,
‫então esta é mais uma dessas funções que
‫realmente não precisamos mais.
‫Porque isso basicamente era para validar o corpo.
‫Então, para ver se ele tinha o nome ou a propriedade do preço neles.
‫Direito?
‫Mas agora nosso modelo
‫de mangusto vai cuidar disso.
‫E então, novamente, isso aqui
‫foi bom para realmente nos mostrar como funciona o
‫middleware, mas agora podemos nos livrar dele.
‫Ok, então vou excluí-lo daqui também.
‫Salve novamente.
‫E agora está de volta ao trabalho.
‫De qualquer forma, a função que
‫estamos criando agora é a função createTour.
‫Onde apenas um dado será
‫chamado assim que alguém acessar a rota do tour com uma solicitação de postagem.
‫Ok, apenas para recapitular porque eu
‫sei que pode ser um
‫pouco confuso com esses arquivos e pastas diferentes
‫e funções diferentes.
‫Mas também é muito
‫importante que comecemos a organizar nosso código
‫desde o início.
‫OK?
‫De qualquer forma, estamos aqui na função createTour.
‫E agora vamos criar um novo tour.
‫E vamos fazer isso com base nos
‫dados que vêm do corpo.
‫Lembre-se disso?
‫Agora lembre-se de como costumávamos criar documentos
‫algumas aulas atrás.
‫Então nós fizemos assim.
‫Por exemplo, digamos newTour
‫então igual a
‫newTour e os dados lá.
‫Então nós fizemos assim e então foi uma nova turnê.
‫E então digitamos newTour. salve e
‫isso funciona bem.
‫Mas podemos fazer isso de uma maneira ainda mais fácil.
‫Então, em vez de fazer isso, podemos
‫fazer um tour. crie e cole os dados lá.
‫Ok e isso fará exatamente a mesma coisa.
‫A principal diferença é que, nesta
‫versão, basicamente chamamos o método diretamente no passeio,
‫enquanto nesta primeira versão chamamos o método
‫no novo documento.
‫Ok, então isso é completamente diferente.
‫Então, novamente, fizemos o tour que criamos a
‫partir do modelo.
‫E então, nesse tour, usamos o método save.
‫Porque o documento tem acesso a este método
‫e a vários outros métodos também.
‫Mas aqui, na segunda
‫situação, chamamos esse método de criação diretamente no próprio modelo, certo?
‫Agora lembre-se de como este método de salvamento aqui retornou uma promessa.
‫E então este criar aqui também retorna uma promessa.
‫E então, para obter acesso ao documento de arquivo
‫conforme foi criado no banco
‫de dados, teríamos então de ter usado. então tudo bem?
‫Mas em vez de usar promessas como essa, vou
‫começar a usar async await.
‫Tudo bem.
‫Portanto, esta função aqui deve ser uma função assíncrona.
‫Portanto, tudo o que
‫precisamos fazer é escrever async bem aqui.
‫Então temos async e agora podemos aguardar o resultado dessa
‫promessa aqui.
‫Espero que você esteja familiarizado com isso.
‫E, na verdade, tenho uma seção
‫neste curso que trata exatamente desse tipo de coisa.
‫Então, se você não assistiu
‫a essa seção, mas ainda não está 100% familiarizado com o async await,
‫vá em frente e assista a essa seção
‫para que você realmente entenda o que está acontecendo aqui.
‫Ok, então em vez de usar isso, aqui vou
‫usar async await e salvar
‫o valor do resultado dessa promessa na nova
‫variável de passeio.
‫Ok, agora a peça final do quebra-cabeça
‫aqui é, é claro, passar alguns dados reais para este método de criação.
‫E então, em vez
‫desse objeto vazio, passaremos no corpo da
‫solicitação, então req. corpo e esses são os
‫dados que vêm com a solicitação de postagem, certo?
‫Agora só mais uma
‫vez, só para ter certeza de que tudo está claro para você.
‫Ok, então podemos usar o modelo de passeio diretamente e
‫chamar o método de criação nele.
‫Então, para essa função, passamos os dados
‫que queremos armazenar no banco de dados como um novo passeio.
‫E esses dados vêm do corpo do post, certo?
‫E isso é armazenado dentro do corpo do ponto da solicitação.
‫Então, essa variável aqui.
‫Agora, este método aqui retornará uma promessa.
‫E esperamos essa promessa usando
‫async await e então armazenamos esse resultado na
‫variável newTour que será
‫o documento recém-criado já com o ID e tudo, certo?
‫Portanto, vou manter este
‫código aqui apenas como uma referência.
‫E, por enquanto, vamos pegar esse dado aqui de volta.
‫Na verdade, um pedaço de código.
‫Dê uma chance.
‫E agora temos esse erro ES lint.
‫Então, vamos dar uma
‫olhada nisso, basta colocar o mouse aqui.
‫E nos diz que as funções assíncronas não são suportadas
‫até este nó 7. 6 e, portanto, este
‫erro de lint ES vem do plugin de nó
‫que realmente instalamos.
‫Então você pode ver isso aqui.
‫Tudo bem, então o que vamos fazer é simplesmente ir
‫para o pacote. json e aqui
‫você encontra a versão do
‫nó que estamos realmente usando.
‫Então isso é muito simples.
‫Precisamos apenas especificar a propriedade engines
‫aqui em nosso documento json.
‫E defina o nó como maior ou
‫igual a 10.
‫Ok, e isso é porque
‫neste curso estamos usando pelo menos o nó dez.
‫Então, 7. 6 seria o suficiente para fazer esse erro
‫desaparecer, mas é claro que especificamos a versão real
‫que estamos realmente usando.
‫Então, nós salvamos este aqui.
‫Feche isso.
‫E agora nosso erro aqui realmente se foi.
‫Agora, só mais uma etapa antes de podermos realmente experimentar
‫isso em nosso aplicativo Postman.
‫E é isso que realmente precisamos para lidar com os erros.
‫Ok, então tenha em mente que, com
‫async await, precisamos testar os erros usando a sintaxe try catch.
‫Então, escrevemos um bloco try.
‫Em seguida, envolva todo o nosso código lá.
‫E então, finalmente, um bloco de captura.
‫Que como já sabemos tem acesso ao objeto de erro.
‫E agora o que realmente colocamos aqui?
‫Bem, precisamos pensar
‫sobre quando exatamente um erro pode acontecer.
‫Portanto, lembre-se de duas palestras
‫atrás, quando estávamos criando nossos primeiros documentos.
‫Ocorreu um
‫erro quando tentamos criar um
‫documento sem um dos campos obrigatórios, certo?
‫E isso foi um erro de validação.
‫E é um dos erros que seriam detectados aqui.
‫Ok porque se tentássemos criar um documento
‫digamos sem um dos campos obrigatórios
‫então essa promessa que
‫é criada aqui seria rejeitada, ok?
‫E então, se tivermos uma promessa
‫rejeitada aqui, ela entrará no bloco catch.
‫Portanto, basicamente neste bloco catch queremos enviar
‫de volta uma resposta
‫dizendo que houve um erro.
‫Tudo bem, então res. status aqui novamente e
‫400 que significa solicitação incorreta. json e agora algo muito semelhante a este,
‫mas seu
‫status e isso falha e, em
‫vez de dados aqui, enviamos uma mensagem e
‫por enquanto vamos apenas definir a mensagem para o erro.
‫Tudo bem.
‫E agora
‫vamos finalmente voltar ao nosso aplicativo Postman e fazer uma tentativa.
‫Ok, então crie este e vamos
‫agora criar um novo tour.
‫Então, agora mesmo, temos o
‫nome dificuldade
‫de duração e preço e, na verdade, vamos
‫adicionar também a classificação e
‫isso precisa estar entre aspas 4. 7
‫Tudo bem, agora é o momento.
‫Envie e de fato aqui vamos nós.
‫Portanto, este é o passeio que
‫acabamos de criar.
‫Temos nossa classificação.
‫Temos o nosso nome e temos o nosso preço.
‫E, claro, o ID criado automaticamente.
‫Agora você pode notar que não temos dificuldade
‫e nenhum preço.
‫Bem, por que você acha que é?
‫Bem, isso é porque esses dois campos não estão
‫realmente em nosso esquema e, portanto,
‫não são colocados no banco de dados.
‫Portanto, tudo o mais que não estiver em
‫nosso esquema é simplesmente ignorado.
‫Então esse é o poder do nosso esquema, certo?
‫Ótimo, agora vamos tentar enviar de novo e isso
‫deve nos dar um erro, certo?
‫E de fato lá vamos nós.
‫Temos nosso 400 pedido incorreto.
‫E temos essa mensagem que é o
‫erro completo que recebemos.
‫E aqui vemos que a mensagem de erro é uma chave duplicada.
‫E isso é porque já temos o Test Tour 2.
‫E assim não poderia criar outro.
‫Então, vamos apenas criar outro aqui, como o Jonas Tour.
‫Isso realmente não importa, ok?
‫Eu só quero criá-lo,
‫primeiro sem nada disso, só
‫para ver se temos outro erro.
‫E, de fato, temos mais alguns erros aqui.
‫Desta vez dizendo que a validação do tour
‫falhou porque um tour deve
‫ter um preço.
‫Ok, então você vê que agora temos
‫esse tipo de estrutura de erro estranha aqui.
‫Portanto, o Mongo DB retorna esse enorme objeto de erro completo.
‫E mais tarde nós vamos cuidar disso.
‫Portanto, teremos uma seção inteira somente sobre tratamento de erros.
‫E então vamos criar alguns erros mais significativos.
‫Ok, por enquanto vamos apenas substituir este objeto
‫de erro por alguma string normal aqui.
‫Então, digamos que dados inválidos foram enviados.
‫Ok, então não faça algo assim em um aplicativo de produção
‫real, mas novamente teremos algum tratamento
‫de erro real um
‫pouco mais tarde, que cuidará disso.
‫Ok, exibindo erros significativos para o cliente.
‫Então vamos voltar aqui e mandar
‫de novo.
‫E agora temos essa string normal aqui.
‫Então, vamos apenas criar o preço aqui.
‫Vamos configurá-lo para 567
‫e enviá-lo.
‫E agora você verá que nossa classificação
‫padrão aqui ainda está funcionando.
‫Agora vamos descobrir tudo isso na bússola também.
‫E, de fato, obtemos nossos quatro passeios no banco de dados.
‫Então, todos esses testes estranhos que estivemos
‫fazendo até este ponto.
‫Então, vamos excluir esses dois últimos.
‫Isso foi realmente apenas para teste.
‫Tudo bem.
‫Então, algo deu errado aqui, eu acho.
‫Ok, agora estamos de volta a esses dois.
‫Vamos agora apenas criar o terceiro que realmente
‫tínhamos antes na última seção.
‫Qual é o Snow Adventurer.
‫Então, o aventureiro da
‫neve.
‫O preço era ...
‫Não tenho mais
‫certeza como 697, talvez.
‫E a classificação
‫é seis ou, na verdade, 4. 8
‫Mandou aquele cara.
‫E então aqui vamos nós.
‫Excelente.
‫Apenas para recapitular rapidamente nossa função createTour.
‫Portanto, temos um try catch aqui porque, na verdade, estamos usando
‫uma função espera assíncrona aqui.
‫Certo, então usamos async await por causa
‫desse tour. create retorna
‫uma promessa que
‫estamos aguardando para que possamos armazenar o
‫documento de tour recém-criado dentro dessa
‫variável e enviá-lo junto com
‫a resposta ao cliente aqui.
‫Ok, mas caso haja um erro, como um
‫erro de validação por exemplo, então
‫esse erro será detectado
‫e enviaremos outra coisa de volta
‫ao cliente com esta mensagem de erro.
‫Então é assim que criamos documentos usando o mangusto.
‫A seguir, vamos falar sobre a leitura de documentos.