‫Jonas: Agora vamos implementar um manipulador de
‫rota para solicitações de postagem para que possamos realmente adicionar um Natour ao nosso
‫conjunto de dados.
‫Assim, assim como com o manipulador de
‫solicitação doGET (), vamos começar adicionando uma nova rota.
‫Então, app. postar desta vez, e
‫lembre-se agora que usamos post so método post
‫aqui, porque esse é o tipo de solicitação que queremos tratar.
‫Então, as solicitações que são feitas com o post verbo http certo?
‫V1
‫e passeios.
‫Assim como falamos na palestra da API REST, a
‫URL é exatamente a mesma.
‫Não importa se queremos obter todos os passeios, ou
‫se queremos criar um novo passeio, o
‫URL é exatamente o mesmo.
‫Então, a única coisa que muda é o método
‫http que usamos para fazer essas solicitações.
‫Para obter todos os passeios e postar para criar um
‫novo passeio, então aqui, nossa função de retorno
‫de chamada típica, onde obtemos acesso
‫à solicitação e ao objeto de resposta para que possamos obter
‫alguns dados da solicitação e enviar de volta um resposta.
‫Agora lembre-se que com uma solicitação
‫de postagem, podemos enviar dados do cliente para o servidor, certo?
‫Esses dados estão idealmente disponíveis mediante solicitação.
‫O objeto de solicitação novamente é o que contém todos os
‫dados, todas as informações sobre a solicitação que foi feita.
‫Se essa solicitação contém alguns dados que
‫foram enviados, esses dados devem estar na solicitação, certo?
‫Agora, pronto para uso, o Express não coloca esses dados do
‫corpo na solicitação e, para ter esses dados disponíveis, temos
‫que usar algo chamado middleware.
‫Falaremos detalhadamente sobre middleware em algumas palestras,
‫mas por enquanto, para fazer
‫isso funcionar, precisamos
‫incluir um middleware simples aqui no topo do arquivo.
‫Então, na verdade, bem aqui.
‫O que precisamos fazer é dizer app. use então expresse.
‫json Ok, e é isso.
‫Então, novamente, este [expresso. json] aqui está o middleware.
‫E o middleware é basicamente uma
‫função que pode modificar os dados de solicitação recebidos.
‫É chamado de middleware porque fica
‫entre, portanto, no meio da solicitação e da resposta.
‫É apenas uma etapa pela qual a
‫solicitação passa enquanto está sendo processada.
‫E a etapa pela qual as solicitações passam,
‫neste exemplo, é simplesmente que os dados do corpo são adicionados a ela.
‫Portanto, ele é adicionado ao objeto de solicitação
‫usando este middleware.
‫Usamos app. use para usar um middleware como este.
‫E, novamente, falaremos muito mais sobre
‫middleware um pouco mais adiante nesta seção.
‫Por enquanto, apenas saiba que é assim que usamos o middleware.
‫Todos os detalhes virão posteriormente.
‫Então, por agora, apenas para começar, eu
‫quero realmente mostrar a você os dados do corpo no console,
‫apenas para verificar se ele realmente funciona, então req. corpo.
‫Novamente, body é a
‫propriedade que estará disponível na solicitação,
‫porque usamos esse middleware alguns momentos atrás.
‫Portanto, queremos registrar [req. body] ao console
‫e também precisamos enviar uma resposta.
‫Então res. envie e por enquanto apenas algum espaço reservado aqui.
‫Apenas 'Concluído', certo.
‫Portanto, sempre precisamos
‫enviar algo de volta para terminar
‫o chamado ciclo de solicitação / resposta, sobre o qual, novamente,
‫aprenderemos um pouco mais adiante nesta seção.
‫Então, vamos agora testar
‫isso e criar uma nova solicitação para a postagem.
‫Agora aqui no carteiro, podemos fazer
‫algo muito bom que é salvar todas essas solicitações.
‫Vou começar criando uma
‫nova coleção, que chamarei de Natours.
‫Nova coleção.
‫Agora, salvarei essa solicitação dentro dessa coleção.
‫Então este é Get all the Tours.
‫Coloque-o no Natours e salve.
‫Portanto, agora temos nossos pedidos Get bem aqui.
‫Bem, agora vamos copiar este aqui, criar
‫um novo.
‫Portanto, este é um pedido de postagem.
‫Antes de fazer
‫isso, irei salvá-lo direto nesta coleção.
‫Portanto, crie um novo tour.
‫Aqui no lado esquerdo, agora temos os nossos dois pedidos.
‫Vamos agora especificar nosso corpo aqui, portanto, os dados
‫que basicamente queremos enviar para o servidor.
‫Viemos aqui para Body e existem diferentes maneiras de fazer isso
‫agora, mas a mais fácil é
‫simplesmente dizer Raw e, em seguida, Application JSON.
‫Tudo o que temos que fazer aqui é basicamente especificar
‫algum JSON, que será transmitido ao servidor.
‫Portanto, a primeira coisa que queremos especificar é
‫o nome do Tour,
‫e você se lembra que em JSON, tudo deve estar
‫entre aspas e, na verdade, aspas duplas, não apenas aspas.
‫Deixe-me chamar isso de Tour
‫de Teste e vamos dar uma olhada no que mais temos nos dados do tour.
‫Então nós temos o nome, temos a duração, e
‫vamos colocar também a dificuldade.
‫Portanto, não vou especificar tudo isso porque
‫isso leva muito tempo.
‫Digamos que a duração seja
‫de 10 dias e a dificuldade seja
‫fácil.
‫Isso conforme nosso corpo será transmitido para o servidor.
‫Isso foi testado agora, clicando em enviar e aqui recebemos
‫nossa resposta, que está pronta, lembre-se.
‫Aqui está a resposta que enviamos, então pronto.
‫E você vê que aqui em nosso
‫console, agora temos um objeto que
‫é basicamente o JSON que enviamos em nosso corpo, certo?
‫Tão perfeito, funciona!
‫Não é mais JSON, como você pode ver.
‫É realmente um objeto JavaScript.
‫Só para mostrar que realmente
‫precisamos do middleware, vamos comentar este.
‫Envie novamente.
‫Agora não tenho mais o pedido. corpo, certo?
‫É por isso que está indefinido agora, porque não existe mais.
‫Salve, envie nossa solicitação
‫novamente e agora está de volta.
‫Temos nossa pós-rota
‫configurada, está funcionando agora e também temos acesso ao corpo,
‫então o que queremos fazer agora é
‫realmente persistir esses dados neste arquivo JSON simples de passeio.
‫Na verdade, vamos modificar este arquivo, para que os dados sejam
‫salvos em nosso banco de dados fictício aqui.
‫Este arquivo JSON agora funciona como nosso
‫banco de dados fictício.
‫Portanto, agora vamos cuidar disso.
‫Vou comentar este aqui.
‫Então vamos começar.
‫A primeira coisa que
‫precisamos fazer é descobrir a id do novo objeto.
‫Lembre-se, novamente na palestra
‫sobre API's REST, é que quando criamos um novo objeto,
‫nunca especificamos o id do objeto.
‫O banco de dados geralmente cuida disso.
‫Um novo objeto geralmente obtém automaticamente seu novo id.
‫Bem, neste caso, não temos nenhum banco de dados, então o
‫que vamos fazer é simplesmente pegar
‫o id do último objeto e adicionar +1 a ele.
‫Vamos fazer isso rapidamente, e isso é apenas
‫JavaScript básico.
‫Tão novo são os passeios, certo?
‫Lembre-se de que passeios, já temos os
‫dados nesta variável de passeios.
‫Essa é uma matriz
‫de todos os objetos de passeio, e queremos obter
‫o último, que são os passeios. comprimento - 1, então a
‫propriedade id disso e adicionamos + 1.
‫Então esse é o novo id.
‫Em seguida, criamos um novo
‫tour, e esse tour
‫será basicamente o corpo que enviaremos mais a nova id que acabamos de criar.
‫Portanto, podemos usar o objeto. atribuir, que basicamente nos
‫permite criar um
‫novo objeto mesclando dois objetos existentes.
‫Portanto, o primeiro
‫objeto será id = newId e,
‫em seguida, queremos a
‫solicitação. corpo.
‫Nós também poderíamos ter feito req. corpo. id = newId,
‫mas eu não queria alterar o objeto do corpo original.
‫Eu apenas deixei assim.
‫Essa é a nova turnê, e agora
‫o que queremos fazer é empurrar essa turnê para a série de turnês, certo?
‫Então, tours, é o conjunto dos nove tours
‫que temos neste ponto.
‫Dizemos empurre e empurre a nova turnê lá.
‫Esse é o array que agora contém o novo tour, mas é
‫claro que agora temos que persistir no arquivo.
‫De novo, isso é bastante fácil para você
‫neste ponto, então use fs. escrever arquivo.
‫Então, qual devemos usar?
‫writeFile ou writeFileSync?
‫A resposta para isso é muito simples.
‫Estamos dentro de uma função de retorno de chamada, que
‫será executada no loop de eventos.
‫Jamais podemos bloquear o loop de eventos.
‫O que vamos fazer é
‫usar writeFile e não sincronizar neste.
‫Queremos passar uma função de retorno
‫de chamada que será processada em segundo plano
‫e, assim que estiver pronta, colocará seu
‫evento em um
‫dos eventos da fila de loop, que será tratado assim que o loop
‫de evento passa essa fase.
‫Lembra-se da palestra do Loop de Eventos?
‫De qualquer forma, vamos pegar o nome
‫do arquivo daqui de cima, porque vamos realmente sobrescrever esse
‫arquivo para que, quando reiniciarmos o servidor,
‫ele esteja lá.
‫Então,
‫onde- bem aqui.
‫Então esse é o arquivo onde queremos escrever.
‫Os dados que queremos escrever, que são passeios, e depois a
‫nossa função de retorno de chamada, que neste
‫caso só tem o erro.
‫Aqui acabei de perceber
‫que precisamos também stringificar esse objeto, certo?
‫Queremos json neste arquivo
‫JSON, e isso agora é apenas
‫um objeto JavaScript simples e normal e, portanto, precisamos convertê-lo.
‫Mas isso é novamente simples, já fiz isso.
‫JSON. stringify do objeto.
‫O que queremos fazer assim que o arquivo for escrito?
‫Bem, o que geralmente fazemos é enviar o objeto recém-criado
‫como a resposta.
‫Vamos fazer isso.
‫Então, resposta
‫e, como sempre, começamos especificando o código de status.
‫Neste caso, não será 200, mas 201.
‫Portanto, 201 significa criado.
‫200 significa ok, 201 significa
‫criado, que é exatamente o que aconteceu aqui.
‫Criamos um novo recurso em um servidor.
‫Então JSON, e continua adicionando esta mensagem aqui.
‫O status é novamente, sucesso.
‫Não estou usando a propriedade results aqui,
‫que tínhamos antes, porque agora estou apenas enviando de volta um resultado.
‫Os dados são o nosso envelope aqui.
‫A turnê é uma nova turnê.
‫É isso!
‫Salve
‫aqui e formate ou codifique um pouco.
‫Vamos adicionar mais espaço aqui.
‫Acho que agora estamos prontos para fazer uma tentativa.
‫Podemos realmente criar um novo passeio, usando esses dados aqui.
‫Portanto, ajuste este Tour de Teste, e com esses
‫dados, vamos esperar por isso.
‫O que aconteceu aqui?
‫Vamos ver, tudo bem.
‫Temos o problema de, basicamente, enviarmos uma resposta duas vezes.
‫Então, enviamos uma resposta com JSON e,
‫em seguida, novamente com. mandar.
‫Isso não é permitido.
‫Na verdade, é por isso que recebemos esse erro aqui.
‫Então, é realmente bom que tenha acontecido aqui, para que você saiba
‫o que significa esse erro padrão aqui.
‫HTTP_HEADERS_SENT não pode definir cabeçalhos após eles
‫serem enviados ao cliente.
‫Isso acontece quando você tenta enviar duas respostas.
‫Precisamos nos livrar disso.
‫Sim, esse foi o único erro que tivemos.
‫Isso agora deve consertar.
‫De uma chance.
‫E, de fato, aqui vamos nós.
‫Então temos nosso id 10,
‫que nosso código criou para nós, e então todo o tour
‫que são exatamente os dados que enviamos como um corpo em nossa solicitação.
‫Agora, a questão é que, quando tivermos todos
‫os tours aqui, eles ainda não aparecerão.
‫Se descermos aqui, na verdade
‫já está aqui.
‫Temos o de antes, então quando tivemos esse
‫erro, ele também criou esse tour aqui.
‫Então, é claro, o passeio que criamos com a id 10.
‫Portanto, este passeio aqui é exatamente este
‫que foi criado agora.
‫Se fizermos agora, Test Tour 2, com duração de apenas 5.
‫Vamos dar uma chance a este, e se eu conseguir todos os tours, então
‫isso aparecerá aqui também.
‫Eu falei no começo que não funcionaria, então não apareceria na
‫hora, porque isso
‫só funciona se reiniciarmos o servidor.
‫Este arquivo, o tour
‫simples. O arquivo json de
‫onde vêm os nossos tours, só
‫é lido no início quando iniciamos o servidor.
‫Agora, o fato é que cada vez que salvamos algo nesse
‫arquivo JSON, ele também recarrega o servidor.
‫Deixe-me provar isso para você, então se eu clicar em salvar
‫agora, veja o que acontece aqui embaixo.
‫Então eu salvei, e você vê que
‫aqui embaixo ele reiniciou o servidor.
‫Também formatou o código, por ser mais bonito.
‫Mas o que importa aqui é que esse código seja atualizado.
‫É por isso que cada vez que salvamos
‫algo aqui com nossa
‫API, ela recarregará imediatamente o servidor e recarregará o
‫conteúdo do arquivo nos passeios, e podemos então ler isso imediatamente.
‫É por isso que
‫temos acesso imediato a todos os passeios recém-criados.
‫Faz sentido?
‫Bem, se não,
‫sinta-se à vontade para fazer suas perguntas e, claro, a seção de perguntas e respostas, certo?