Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
JavaScriptchevron-right

Crie uma API RESTful com o HapiJS e o MongoDB

Ado Kukic15 min read • Published Jan 17, 2022 • Updated Oct 01, 2024
Node.jsMongoDBJavaScript
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Pré-requisitos

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.

O que é o Hapi.js?

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.
Página inicial do HapiJS
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 que estamos construindo: Banco de dados de filmes RESTful

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.
Collection de filmes
Não criaremos uma IU neste tutorial. Em vez disso, vamos nos concentrar em aproveitar ao máximo nosso backend do Hapi.js.

Configurando um aplicativo 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:
1npm init
2
3npm install @hapi/hapi --save
A execução donpm 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.jsonrecé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:
1const Hapi = require('@hapi/hapi');
2
3const server = Hapi.server({
4 port: 3000,
5 host: 'localhost'
6});
7
8server.route({
9 method: 'GET',
10 path: '/',
11 handler: (req, h) => {
12
13 return 'Hello from HapiJS!';
14 }
15});
16
17server.start();
18console.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étodoHapi.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:
1node index.js
Se navegarmos até localhost:3000 em nosso navegador da Web preferido, o resultado será o seguinte:
HapiJS Hello World
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.

Criação de uma API RESTful com Hapi.js

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 arquivoindex.jscom as rotas de que precisamos.
1const Hapi = require('@hapi/hapi');
2
3const server = Hapi.server({
4 port: 3000,
5 host: 'localhost'
6});
7
8// Get all movies
9server.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
19server.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
29server.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
39server.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
49server.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
59server.route({
60 method: 'GET',
61 path: '/search',
62 handler: (req, h) => {
63
64 return 'Return search results for the specified term';
65 }
66});
67
68server.start();
69console.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.

Conectando nosso aplicativo Hapi.js ao MongoDB

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:
1npm install hapi-mongodb --save
Com o pacote instalado, Go ao nosso arquivoindex.js e configurar o plugin. O processo para isso depende do métodoregister() fornecido na API do Hapi. Registraremos nosso plugin da seguinte forma:
1server.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:
1const Hapi = require('@hapi/hapi');
2
3const 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
85init();
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
2server.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:
Dados JSON para um único filme
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.

Implementando as rotas RESTful

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.

Obter 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
2server.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çãometacritic 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.

Filme Get Single

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
2server.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 objetoreq.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, yeare released campos. O resultado está abaixo.
Projeção de driver MongoDB
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}.

Adicionar um filme

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
2server.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
15The 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 objetoreq, 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.
Solicitação do Postman
Nesta rota, adicionamos a funcionalidade para inserir um documento totalmente novo; na próxima rota, atualizaremos um documento existente.

Atualizar um filme

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 arquivoindex.js.
1npm install @hapi/joi --save
2npm 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
2const Joi = require('@hapi/joi');
3Joi.objectId = require('joi-objectid')(Joi)
4
5// Update the details of a movie
6server.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 optionse 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.
Solicitação de colocação do carteiro
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

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
2server.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étododeleteOne()e passaremos o ObjectId a ser excluído.
Solicitação de exclusão do carteiro
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.

Pesquisar um filme

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 .
Atlas Search
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
2server.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 rotasearch 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:
Resultados do Atlas Search
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.

Juntando tudo

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-inhapi-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!

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Introdução ao Bun e ao MongoDB


Jul 19, 2024 | 9 min read
Tutorial

Gerenciando uma arquitetura de metadados de catálogo de produtos inteligentes com MongoDB Atlas e Google Cloud Platform Google Cloud Platform


Dec 16, 2024 | 9 min read
Tutorial

Trabalhando com MongoDB Charts e o novo SDK para JavaScript


Apr 02, 2024 | 10 min read
exemplo de código

Gestão de revistas


Sep 11, 2024 | 0 min read
Sumário