Crie uma API RESTful com o HapiJS e o MongoDB
Avalie esse Tutorial
Enquanto JAMStack, geradores de sites estáticose funções sem servidor continuam a estar na moda em 2020, frameworks tradicionais como Express.js e Hapi.js continuam sendo a solução preferida de muitos desenvolvedores. Essas estruturas são testadas em campo, confiáveis e escaláveis; portanto, embora possam não ser a tecnologia mais popular, você pode contar com elas para realizar o trabalho.
Neste post, vamos construir um aplicativo da web com Hapi.js e MongoDB. Se você quiser acompanhar este tutorial, pode obter o código deste repositório doGitHub. Além disso, certifique-se de se inscrever em uma conta gratuita do MongoDB Atlas para garantir que você possa implementar todo o código neste tutorial.
Para este tutorial, você precisará de:
Você pode baixar o Node.js aquie ele vem com a versão mais recente do npm. Para o MongoDB, use oMongoDB Atlas gratuitamente. Embora você possa usar uma instalação local do MongoDB, não será possível implementar algumas das funcionalidades que dependem do MongoDB Atlas Search, portanto, recomendamos que você experimente o Atlas. Todos os outros itens necessários serão abordados no artigo.
Hapi.js ou simplesmente Hapi é uma frameworkNode.js para "criar aplicativos poderosos e escaláveis, com sobrecarga mínima e funcionalidade completa e pronta para uso". Originalmente desenvolvida para a plataforma de e-commerce do Walmart, a framework foi adotada por muitas empresas. Em minha experiência pessoal, trabalhei com várias empresas que confiaram fortemente no Hapi.js para sua infraestrutura mais crítica, desde APIs RESTful a aplicativos web tradicionais.
Para este tutorial, presumirei que você já esteja familiarizado com JavaScript e Node.js. Caso contrário, gostaria de sugerir que consulte o siteNodejs.dev, que oferece uma ótima introdução ao Node.js e colocará você em funcionamento rapidamente.
O aplicativo que vamos construir hoje exporá uma série de endpoints RESTful para trabalhar com uma collection de filmes. O conjunto de dados no qual confiaremos pode ser acessado carregando conjuntos de dados de exemplo em seu MongoDB Atlas cluster. Em seu dashboard do MongoDB, navegue até a abaClusters . Clique no botão de reticências (...) no MongoDB Atlas cluster que você deseja usar e selecione a opçãoCarregar conjunto de dados de amostra. Em alguns minutos, você terá uma série de novos bancos de dados criados, e o único com o qual trabalharemos se chama
sample_mflix
.Não criaremos uma IU neste tutorial. Em vez disso, vamos nos concentrar em aproveitar ao máximo nosso backend do Hapi.js.
Como em qualquer aplicativo Node.js, começaremos nosso projeto instalando alguns pacotes do gerenciador de pacotes do nó ou do npm. Navegue até um diretório onde você gostaria de armazenar seu aplicativo e execute os seguintes comandos:
1 npm init 2 3 npm install @hapi/hapi --save
A execução do
npm init
criará um arquivopackage.json
onde podemos armazenar nossas dependências. Ao executar este comando, você receberá uma série de perguntas que determinarão como o arquivo é preenchido. Não há problema em deixar todos os padrões como estão. O comandonpm install @hapi/hapi --save
puxará a versão mais recente da estrutura Hapi.js e salvará uma referência a esta versão no arquivopackage.json
recém-criado. Quando concluir esta etapa, crie um arquivoindex.js
no diretório raiz e abra-o.Assim como o Express, o Hapi.js não é uma estrutura muito prescritiva. O que quero dizer com isso é que nós, como desenvolvedores, temos total flexibilidade para decidir como queremos que nossa estrutura de diretórios seja. Poderemos ter todo o nosso aplicativo em um único arquivo ou dividi-lo em centenas de componentes, o Hapi.js não se importa. Para garantir que nossa instalação foi bem-sucedida, vamos escrever um aplicativo simples para exibir uma mensagem em nosso navegador. Nosso código será mais ou menos assim:
1 const Hapi = require('@hapi/hapi'); 2 3 const server = Hapi.server({ 4 port: 3000, 5 host: 'localhost' 6 }); 7 8 server.route({ 9 method: 'GET', 10 path: '/', 11 handler: (req, h) => { 12 13 return 'Hello from HapiJS!'; 14 } 15 }); 16 17 server.start(); 18 console.log('Server running on %s', server.info.uri);
Vamos percorrer o código acima para entender o que está ocorrendo aqui. No início de nosso programa, exigimos o pacote hapi que importa todas as API do Hapi.js e as disponibiliza em nosso aplicativo. Em seguida, usamos o método
Hapi.server
para criar uma instância de um servidor Hapi e passar nossos parâmetros. Agora que temos um servidor, podemos adicionar rotas a ele, e é o que vamos fazer na seção subsequente. Estamos definindo uma única rota para nossa página inicial, informando que essa rota só pode ser acessada por meio de uma solicitaçãoGET, e a função do manipulador apenas retornará a mensagem "Olá do HapiJS!. Finalmente, iniciamos o servidor Hapi.js e exibimos uma mensagem no console informando que o servidor está em execução. Para iniciar o servidor, execute o seguinte comando na janela do terminal:1 node index.js
Se navegarmos até
localhost:3000
em nosso navegador da Web preferido, o resultado será o seguinte:Se você ver a mensagem acima em seu navegador, está pronto para prosseguir para a próxima seção. Se você tiver algum problema, primeiro garantiria que você tenha a versão mais recente do Node.js instalada e que tenha uma pasta
@hapi/hapi
dentro do diretórionode_modules
.Agora que entendemos o básico, vamos em frente e criar as rotas reais para nossa API. As rotas API que precisaremos criar são as seguintes:
- Obter todos os filmes
- Obter um único filme
- Inserir um filme
- Atualizar um filme
- Excluir um filme
- Atlas Search para um filme
Na maior parte, temos apenas operações CRUD tradicionais com as quais você provavelmente está familiarizado. Porém, nossa rota final é um pouco mais avançada. Essa rota implementará a funcionalidade de pesquisa e nos permitirá destacar alguns dos recursos mais avançados do Hapi.js e do MongoDB. Vamos atualizar nosso arquivo
index.js
com as rotas de que precisamos.1 const Hapi = require('@hapi/hapi'); 2 3 const server = Hapi.server({ 4 port: 3000, 5 host: 'localhost' 6 }); 7 8 // Get all movies 9 server.route({ 10 method: 'GET', 11 path: '/movies', 12 handler: (req, h) => { 13 14 return 'List all the movies'; 15 } 16 }); 17 18 // Add a new movie to the database 19 server.route({ 20 method: 'POST', 21 path: '/movies', 22 handler: (req, h) => { 23 24 return 'Add new movie'; 25 } 26 }); 27 28 // Get a single movie 29 server.route({ 30 method: 'GET', 31 path: '/movies/{id}', 32 handler: (req, h) => { 33 34 return 'Return a single movie'; 35 } 36 }); 37 38 // Update the details of a movie 39 server.route({ 40 method: 'PUT', 41 path: '/movies/{id}', 42 handler: (req, h) => { 43 44 return 'Update a single movie'; 45 } 46 }); 47 48 // Delete a movie from the database 49 server.route({ 50 method: 'DELETE', 51 path: '/movies/{id}', 52 handler: (req, h) => { 53 54 return 'Delete a single movie'; 55 } 56 }); 57 58 // Search for a movie 59 server.route({ 60 method: 'GET', 61 path: '/search', 62 handler: (req, h) => { 63 64 return 'Return search results for the specified term'; 65 } 66 }); 67 68 server.start(); 69 console.log('Server running on %s', server.info.uri);
Criamos nossas rotas, mas, atualmente, tudo o que elas fazem é retornar uma string informando qual é a função da rota. Isso não é bom. Em seguida, conectaremos nosso aplicativo Hapi.js ao nosso MongoDB database para que possamos retornar dados reais. Usaremos o driver Node.js do MongoDB para fazer isso.
Se você estiver interessado em saber mais sobre o driver do MongoDB Node.js por meio de um treinamento detalhado, confira o cursoCaminho do programador do MongoDB Node.js na MongoDB University. Ele é gratuito e aprenderá tudo sobre como ler e gravar dados com o driver, usar a estrutura de agregação e muito mais.
Conectar um backend do Hapi.js a um MongoDB database pode ser feito de várias maneiras. Poderíamos usar o método tradicional de apenas trazer o driver Node.js do MongoDB via npm, poderíamos usar uma biblioteca ODM como o Mongoose, mas acredita que há uma maneira melhor de fazer isso. A maneira como vamos nos conectar ao MongoDB database em nosso Atlas cluster é usando um plug-in Hapi.js.
O Hapi.js tem muitos plugins excelentes para todas as suas necessidades de desenvolvimento. Se essa necessidade é de autenticação, registro, localização ou, no nosso caso, acesso a dados, a páginade plug-ins do Hapi.js oferece muitas opções. O plugin que vamos usar é chamado
hapi-mongodb
. Vamos instalar este pacote executando:1 npm install hapi-mongodb --save
Com o pacote instalado, Go ao nosso arquivo
index.js
e configurar o plugin. O processo para isso depende do métodoregister()
fornecido na API do Hapi. Registraremos nosso plugin da seguinte forma:1 server.register({ 2 plugin: require('hapi-mongodb'), 3 options: { 4 uri: 'mongodb+srv://{YOUR-USERNAME}:{YOUR-PASSWORD}@main.zxsxp.mongodb.net/sample_mflix?retryWrites=true&w=majority', 5 settings : { 6 useUnifiedTopology: true 7 }, 8 decorate: true 9 } 10 });
Gostaríamos de registrar este plugin antes de nossas rotas. Para o objeto options, estamos passando nosso URI de serviço MongoDB Atlas, bem como o nome do nosso banco de dados, que neste caso será
sample_mflix
. Se você estiver trabalhando com um banco de dados diferente, certifique-se de atualizá-lo adequadamente. Também queremos fazer mais um ajuste em toda a nossa base de código antes de prosseguir. Se tentarmos executar nosso aplicativo happy.js agora, receberemos um erro informando que não podemos iniciar nosso servidor antes que os plug-ins terminem de se registrar. O método register levará algum tempo para ser executado e teremos que esperar por ele. Em vez de lidar com isso de forma síncrona, encapsularemos uma função assíncrona em torno da instanciação do servidor. Isso tornará nosso código muito mais limpo e fácil de raciocinar. O resultado final ficará assim:1 const Hapi = require('@hapi/hapi'); 2 3 const init = async () => { 4 5 const server = Hapi.server({ 6 port: 3000, 7 host: 'localhost' 8 }); 9 10 await server.register({ 11 plugin: require('hapi-mongodb'), 12 options: { 13 url: 'mongodb+srv://{YOUR-USERNAME}:{YOUR-PASSWORD}@main.zxsxp.mongodb.net/sample_mflix?retryWrites=true&w=majority', 14 settings: { 15 useUnifiedTopology: true 16 }, 17 decorate: true 18 } 19 }); 20 21 // Get all movies 22 server.route({ 23 method: 'GET', 24 path: '/movies', 25 handler: (req, h) => { 26 27 return 'List all the movies'; 28 } 29 }); 30 31 // Add a new movie to the database 32 server.route({ 33 method: 'POST', 34 path: '/movies', 35 handler: (req, h) => { 36 37 return 'Add new movie'; 38 } 39 }); 40 41 // Get a single movie 42 server.route({ 43 method: 'GET', 44 path: '/movies/{id}', 45 handler: (req, h) => { 46 47 return 'Return a single movie'; 48 } 49 }); 50 51 // Update the details of a movie 52 server.route({ 53 method: 'PUT', 54 path: '/movies/{id}', 55 handler: (req, h) => { 56 57 return 'Update a single movie'; 58 } 59 }); 60 61 // Delete a movie from the database 62 server.route({ 63 method: 'DELETE', 64 path: '/movies/{id}', 65 handler: (req, h) => { 66 67 return 'Delete a single movie'; 68 } 69 }); 70 71 // Search for a movie 72 server.route({ 73 method: 'GET', 74 path: '/search', 75 handler: (req, h) => { 76 77 return 'Return search results for the specified term'; 78 } 79 }); 80 81 await server.start(); 82 console.log('Server running on %s', server.info.uri); 83 } 84 85 init();
Agora devemos ser capazes de reiniciar nosso servidor e ele registrará o plug-in corretamente e funcionará conforme o esperado. Para garantir que nossa conexão com o banco de dados funcione, vamos executar uma consulta de exemplo para retornar apenas um único filme quando atingirmos a rota
/movies
. Faremos isso com uma operaçãofindOne()
. O plug-inhapi-mongodb
é apenas um wrapper para o driver oficial do MongoDB Node.js, portanto, todos os métodos funcionam exatamente da mesma forma. Confira os Docs para obter detalhes sobre todos os métodos disponíveis. Vamos usar o métodofindOne()
para retornar um único filme do banco de dados.1 // Get all movies 2 server.route({ 3 method: 'GET', 4 path: '/movies', 5 handler: async (req, h) => { 6 7 const movie = await req.mongo.db.collection('movies').findOne({}) 8 9 return movie; 10 } 11 });
Também contaremos com o padrão async/await em nossas funções de manipulador para manter nosso código limpo e conciso. Observe como nosso MongoDB database agora pode ser acessado por meio do
req
ou do objeto de solicitação. Não precisamos passar uma instância de nosso banco de dados, o plug-in cuidou de tudo isso para nós, tudo o que precisamos fazer foi decidir qual seria nossa chamada para o banco de dados. Se reiniciarmos nosso servidor e navegarmos para localhost:3000/movies
em nosso navegador, devemos ver a seguinte resposta:Se você receber a resposta JSON, isso significa que sua conexão com o banco de dados é boa e seu plugin foi registrado corretamente com o aplicativo Hapi.js. Se você vir algum tipo de erro, consulte cuidadosamente as instruções acima. Em seguida, implementaremos nossas chamadas de banco de dados reais para nossas rotas.
Temos seis rotas de API para implementar. Abordaremos cada um deles e introduziremos novos conceitos para Hapi.js e MongoDB. Começaremos com a rota que nos leva a todos os filmes.
Esta rota irá recuperar uma lista de filmes. Como nosso conjunto de dados contém milhares de filmes, não gostaríamos de retornar todos eles de uma vez, pois isso provavelmente causaria o travamento do navegador do usuário, portanto, limitaremos o conjunto de resultados a 20 itens por vez. Permitiremos que o usuário passe um parâmetro de consulta opcional que fornecerá os próximos 20 resultados no conjunto. Minha implementação está abaixo.
1 // Get all movies 2 server.route({ 3 method: 'GET', 4 path: '/movies', 5 handler: async (req, h) => { 6 7 const offset = Number(req.query.offset) || 0; 8 9 const movies = await req.mongo.db.collection('movies').find({}).sort({metacritic:-1}).skip(offset).limit(20).toArray(); 10 11 return movies; 12 } 13 });
Em nossa implementação, a primeira coisa que podemos fazer é classificar nossa coleção para garantir uma ordem consistente de documentos. Em nosso caso, estamos classificando pela pontuação
metacritic
em ordem decrescente, o que significa que obteremos primeiro os filmes mais bem avaliados. Em seguida, verificamos se há um parâmetro de query do offset
. Se houver um, pegaremos seu valor e o converteremos em um número inteiro; caso contrário, definiremos o valor de deslocamento para 0. Em seguida, quando fizermos uma chamada para nosso MongoDB database, usaremos esse valoroffset
no métodoskip()
que dirá ao MongoDB quantos documentos devem ser ignorados. Por fim, usaremos o métodolimit()
para limitar nossos resultados a 20 registros, e o métodotoArray()
para transformar o cursor que voltamos a um objeto.Experimente. Reinicie seu servidor Hapi.js e navegue até
localhost:3000/movies
. Tente passar um parâmetro de query de deslocamento para ver como os resultados mudam. Por exemplo, tente localhost:3000/movies?offset=500
. Observe que, se você passar um valor não inteiro, provavelmente receberá um erro. Não estamos fazendo nenhum tipo de tratamento de erros neste tutorial, mas em um aplicativo do mundo real, você deve lidar com todos os erros adequadamente. Em seguida, vamos implementar o método para retornar um único filme.Essa rota retornará os dados de apenas um único filme. Para este método, também usaremos a projeção, o que nos permitirá escolher quais campos receberemos de volta do MongoDB. Aqui está a minha implementação:
1 // Get a single movie 2 server.route({ 3 method: 'GET', 4 path: '/movies/{id}', 5 handler: async (req, h) => { 6 const id = req.params.id 7 const ObjectID = req.mongo.ObjectID; 8 9 const movie = await req.mongo.db.collection('movies').findOne({_id: new ObjectID(id)},{projection:{title:1,plot:1,cast:1,year:1, released:1}}); 10 11 return movie; 12 } 13 });
Nesta implementação, estamos usando o objeto
req.params
para obter o valor dinâmico de nossa rota. Também estamos usando o métodoreq.mongo.ObjectID
, que nos permitirá transformar o ID em um ObjectId que usamos como nosso identificador exclusivo no MongoDB database. Vamos ter que converter nossa string em um ObjectId, caso contrário, nosso métodofindOne()
não funcionará, pois nosso campo_id
não é armazenado como uma string. Também estamos usando uma projeção para retornar somente os campostitle
, plot
, cast
, year
e released
campos. O resultado está abaixo.Uma dica rápida sobre projeção. No exemplo acima, usamos o formato
{ fieldName: 1 }
, que disse ao MongoDB para retornar somente esse campo específico. Se, em vez disso, quisermos omitir apenas alguns campos, poderíamos ter usado o formato{ fieldName: 0}
inverso. Isso nos enviaria todos os campos, exceto aqueles nomeados e que receberam um valor de zero na opção de projeção. Observe que você não pode misturar e combinar os formatos 1 e 0 , você precisa escolher um. A única exceção é o campo_id
, onde se você não quiser, pode passar {_id:0}
.A próxima rota que implementaremos será nossa operação de inserção e nos permitirá adicionar um documento à nossa coleção. A implementação é parecida com a seguinte:
1 // Add a new movie to the database 2 server.route({ 3 method: 'POST', 4 path: '/movies', 5 handler: async (req, h) => { 6 7 const payload = req.payload 8 9 const status = await req.mongo.db.collection('movies').insertOne(payload); 10 11 return status; 12 } 13 }); 14 15 The payload that we are going to submit to this endpoint will look like this: 16 17 .. code-block:: javascript 18 19 { 20 "title": "Avengers: Endgame", 21 "plot": "The avengers save the day", 22 "cast" : ["Robert Downey Jr.", "Chris Evans", "Scarlett Johansson", "Samuel L. Jackson"], 23 "year": 2019 24 }
Em nossa implementação, estamos usando novamente o objeto
req
, mas desta vez estamos usando o payload
para obter os dados enviados ao endpoint. Para testar se o nosso endpoint funciona, usaremos oPostman para enviar a solicitação. Nossa resposta nos fornecerá muitas informações sobre o que aconteceu com a operação; portanto, para fins informativos, apenas retornaremos o documento inteiro. Em um aplicativo do mundo real, você apenas enviaria de volta uma {message: "ok"}
ou declaração semelhante. Se observarmos a resposta, encontraremos um campo intitulado insertedCount: 1
e isso nos informará que nosso documento foi inserido com sucesso.Nesta rota, adicionamos a funcionalidade para inserir um documento totalmente novo; na próxima rota, atualizaremos um documento existente.
Atualizar um filme funciona da mesma forma que adicionar um novo filme. No entanto, gostaria de introduzir um novo conceito em Hapi.js aqui e esse é o conceito de validação. Hapi.js pode nos ajudar a validar facilmente os dados antes que nossa função de manipulador seja chamada. Para fazer isso, importaremos um pacote mantido pela equipe do Hapi.js chamada J oi. Para trabalhar com oJoi, primeiro precisaremos instalar o pacote e incluí-lo em nosso arquivo
index.js
.1 npm install @hapi/joi --save 2 npm install joi-objectid --save
Em seguida, vamos dar uma olhada em nossa implementação da rota de atualização e então eu explicarei como tudo se encaixa.
1 // Add this below the @hapi/hapi require statement 2 const Joi = require('@hapi/joi'); 3 Joi.objectId = require('joi-objectid')(Joi) 4 5 // Update the details of a movie 6 server.route({ 7 method: 'PUT', 8 path: '/movies/{id}', 9 options: { 10 validate: { 11 params: Joi.object({ 12 id: Joi.objectId() 13 }) 14 } 15 }, 16 handler: async (req, h) => { 17 const id = req.params.id 18 const ObjectID = req.mongo.ObjectID; 19 20 const payload = req.payload 21 22 const status = await req.mongo.db.collection('movies').updateOne({_id: ObjectID(id)}, {$set: payload}); 23 24 return status; 25 26 } 27 });
Com essa rota, estamos realmente começando a mostrar a força do Hapi.js. Nessa implementação, adicionamos um objeto
options
e passamos um objeto validate
. A partir daí, validamos que o parâmetroid
corresponde ao que esperamos que seja uma string ObjectID. Caso contrário, nossa função de manipulador nunca seria chamada; em vez disso, a solicitação sofreria um curto-circuito e receberíamos uma mensagem de erro apropriada. O Joi pode ser usado para validar não apenas os parâmetros definidos, mas também os parâmetros de consulta, a carga útil e até mesmo os cabeçalhos. Nós mal arranhamos a superfície.O restante da implementação nos levou a executar um método
updateOne()
que atualizou um objeto existente com os novos dados. Novamente, estamos retornando todo o objeto de status aqui para fins didáticos, mas em um aplicativo do mundo real, não seria uma boa enviar esses dados brutos.Excluir um filme simplesmente removerá o registro da nossa coleção. Não há muitas novas funcionalidades para mostrar aqui, então vamos direto para a implementação.
1 // Update the details of a movie 2 server.route({ 3 method: 'PUT', 4 path: '/movies/{id}', 5 options: { 6 validate: { 7 params: Joi.object({ 8 id: Joi.objectId() 9 }) 10 } 11 }, 12 handler: async (req, h) => { 13 const id = req.params.id 14 const ObjectID = req.mongo.ObjectID; 15 16 const payload = req.payload 17 18 const status = await req.mongo.db.collection('movies').deleteOne({_id: ObjectID(id)}); 19 20 return status; 21 22 } 23 });
Em nossa implementação da rota de exclusão, continuaremos a usar a biblioteca Joi para validar se o parâmetro a ser excluído é um ObjectId real. Para remover um documento de nossa coleção, usaremos o método
deleteOne()
e passaremos o ObjectId a ser excluído.A implementação desta rota conclui nosso debate sobre as operações CRUD básicas. Para encerrar este tutorial, vamos implementar uma rota final que nos permitirá pesquisar nosso banco de dados de filmes.
Para concluir nossas rotas, adicionaremos a capacidade de um usuário pesquisar um filme. Para fazer isso, usaremos uma funcionalidade do MongoDB Atlas chamada Atlas Search. Antes de implementarmos essa funcionalidade em nosso backend, primeiro precisaremos ativar o Atlas Search e criar um índice em nosso painel do MongoDB Atlas. Navegue até seu painel e localize o
sample_mflix
banco de dados do . Selecione a movies
collection e clique na guiabeta .Clique no botãoCriar índice do Atlas Search e, para este tutorial, podemos deixar os mapeamentos de campo em seu estado dinâmico padrão, então basta clicar no botãoCriar índice. Enquanto nosso índice é criado, podemos Go nossa funcionalidade de back-end. A implementação será parecida com a seguinte:
1 // Search for a movie 2 server.route({ 3 method: 'GET', 4 path: '/search', 5 handler: async(req, h) => { 6 const query = req.query.term; 7 8 const results = await req.mongo.db.collection("movies").aggregate([ 9 { 10 $searchBeta: { 11 "search": { 12 "query": query, 13 "path":"title" 14 } 15 } 16 }, 17 { 18 $project : {title:1, plot: 1} 19 }, 20 { 21 $limit: 10 22 } 23 ]).toArray() 24 25 return results; 26 } 27 });
Nossa rota
search
nos fez usar o extremamente poderoso pipeline de agregação do MongoDB. No primeiro estágio do pipeline, estamos usando o atributo$searchBeta
e passando nosso termo de pesquisa. No próximo estágio do pipeline, executamos um $project
para retornar apenas campos específicos, no nosso caso title
e plot
do filme. Finalmente, limitamos nossos resultados da pesquisa a dez itens, convertemos o cursor em uma array e a enviamos ao navegador. Vamos tentar executar uma query de pesquisa em nossa coleção de filmes. Tente pesquisar por localhost:3000/search?term=Star+Wars
. Seus resultados ficarão assim:O MongoDB Atlas Search é muito poderoso e fornece todas as ferramentas para adicionar funcionalidade de pesquisa soberba aos seus dados sem depender de APIs externas. Confira a documentação para saber mais sobre como melhor aproveitá-la em seus aplicativos.
Neste tutorial, mostrei como criar uma API RESTful com Hapi.js e MongoDB. Arrachamos a superfície dos recursos de ambos, mas espero que tenha sido uma boa introdução e tenha dado uma ideia do que é possível fazer. O Hapi.js tem um extenso sistema de plug-ins que permitirá que você leve quase qualquer funcionalidade para seu backend com apenas algumas linhas de código. A integração do MongoDB ao Hapi.js usando o plug-in
hapi-mongo
permite que você se concentre na criação de recursos e funcionalidades, em vez de descobrir as melhores práticas e como unir tudo. Por falar em cola, o Hapi.js tem um pacote chamado cola que facilita a divisão do servidor em vários componentes, não precisamos fazer isso em nosso tutorial, mas é uma ótima próxima etapa para você explorar.Se você deseja obter o código deste tutorial, pode encontrá-lo aqui. Se você quiser experimentar o Atlas Search, inscreva-se no MongoDB Atlas gratuitamente.
Feliz, er... Hapi codificação!