Introdução ao Deno & MongoDB
Jesse Hall12 min read • Published Jan 21, 2022 • Updated Sep 09, 2024
Avalie esse Início rápido
Deno é um tempo de execução "modern " para JavaScript e TypeScript criado no Rust. Isso torna muito rápido!
Se você está familiarizado com o Node.js, se sentirá em casa com o Deno. É muito semelhante, mas tem algumas melhorias em relação ao Node.js. Na verdade, o criador do Deno, Ryan Dahl, também criou o Node e Deno deve ser o sucessor do Node.js.
} Curiosidade: Deno é um anagrama. Reorganizar as letras no nó para escrever Deno.
O Deno não tem gerenciador de pacotes, usa módulos ES , tem de primeira classe ,
await
tem testes integrados e é um tanto compatível com o navegador ao fornecer embutido fetch
e o window
objeto global .Além disso, também é muito seguro. Ele é completamente bloqueado por padrão e exige que você habilite cada método de acesso especificamente.
Isso faz com que o Deno emparelhe bem com o MongoDB, pois ele também é super seguro por padrão.
Aqui está uma versão em vídeo deste artigo, se você preferir assistir.
- TypeScript — O Deno usa o TypeScript por padrão, portanto, é necessário algum conhecimento do TypeScript.
- Conhecimento básico de MongoDB
- Noções básicas sobre APIs RESTful
Você precisará instalar o Deno para começar.
- macOS e Linux Shell:
curl -fsSL https://deno.land/install.sh | sh
- Windows PowerShell:
iwr https://deno.land/install.ps1 -useb | iex
Para este tutorial, usaremos o Oak, uma estrutura de middleware para o Deno. Isso fornecerá roteamento para nossos vários pontos de extremidade de aplicativos para realizar operações CRUD.
Começaremos criando um arquivo
server.ts
e importando o método OakApplication
.} Se você estiver familiarizado com o Node.js, notará que o Deno faz as coisas de forma um pouco diferente. Em vez de usar um arquivo
package.json
e baixar todos os pacotes para o diretório do projeto, o Deno usa caminhos de arquivo ou URL para fazer referência às importações do módulo. Os módulos são baixados e armazenados em cache localmente, mas isso é feito globalmente e não por projeto. Isso elimina muito do bloat inerente ao Node.js e sua pastanode_modules
.Em seguida, vamos iniciar o servidor.
Vamos criar nossas rotas em um novo arquivo chamado
routes.ts
. Desta vez, importaremos o métodoRouter
do Oracle. Em seguida, crie uma nova instância de Router()
e exporte-a.Agora, vamos trazer nosso
router
para nosso arquivoserver.ts
.Na maioria dos tutoriais, você verá que eles usam o móduloMongo de terceiros. Para este tutorial, usaremos a nova MongoDB Atlas Data API para interagir com nosso MongoDB Atlas no Mongo. A MongoDB Atlas Data API não exige nenhum driver!
Vamos configurar nossa MongoDB Atlas MongoDB Atlas Data API. Você precisará de uma conta do MongoDB Atlas. Se você já tiver um, entreou registre-se agora.
No Painel do MongoDB Atlas, clique na opção Atlas Data API. Por padrão, todos os clusters do MongoDB Atlas têm a Atlas Data API desativada. Vamos habilitá-lo para o nosso cluster. Você pode desligá-lo novamente a qualquer momento.
Depois de ativar o MongoDB Atlas Data API, precisaremos criar uma API. Você pode nomear sua chave o que quiser. Vou nomear o meu
data-api-test
. Certifique-se de copiar seu segredo de chave API neste ponto. Você não o verá de novo!Além disso, anote o ID do seu aplicativo. Ele pode ser encontrado em seu ponto de conexão da URL para a API de dados.
Exemplo:
https://data.mongodb-api.com/app/{APP_ID}/endpoint/data/beta
Neste ponto, precisamos configurar cada função para cada rota. Eles serão responsáveis por criar, ler, atualizar e excluir (CRUD) documentos em nosso banco de dados MongoDB.
Vamos criar uma nova pasta chamada
controllers
e um arquivo dentro dela chamado todos.ts
.Em seguida, configuraremos nossas variáveis ambientais para manter nossos segredos seguros. Para isso, usaremos um módulo chamado dotenv.
Aqui, estamos importando o método
config
desse módulo e, em seguida, usando-o para obter nossas variáveis ambientaisDATA_API_KEY
e APP_ID
. Eles serão extraídos de outro arquivo que criaremos na raiz do nosso projeto chamado .env
. Apenas a extensão e nenhum nome de arquivo.Esse é um arquivo de texto simples que permite armazenar segredos que você não deseja que sejam carregados no GitHub ou exibidos em seu código. Para garantir que eles não sejam carregados no GitHub, criaremos outro arquivo na raiz do nosso projeto chamado
.gitignore
. Novamente, apenas a extensão sem nome.Neste arquivo, digitaremos simplesmente
.env
. Isso permite que git saiba ignorar este arquivo para que ele não seja rastreado.Agora, de volta ao arquivo
todos.ts
. Configuraremos algumas variáveis que serão usadas ao longo de cada função.Configuraremos nosso URI base para nosso endpoint do Atlas Data API. Isso utilizará nosso ID do aplicativo. Então precisamos definir nossa fonte de dados, banco de dados e coleção. Eles seriam específicos para o seu caso de uso. E, por fim, definiremos nossas opções de busca, passando nossa chave da API de dados.
Agora podemos finalmente começar a criar nossa primeira função de rota. Chamaremos essa função de
addTodo
. Essa função adicionará um novo item de tarefa à nossa coleção de banco de dados.Esta função aceitará um
request
e response
. Se o request
não tiver um body
, ele retornará um erro. Caso contrário, obteremos o todo
do body
do request
e usaremos o ponto de extremidade da API de dados do AtlasinsertOne
para inserir um novo documento em nosso banco de dados.Fazemos isso criando um
query
que define nosso dataSource
, database
, collection
e o document
que estamos adicionando. Isso é definido em string e enviado usando fetch
. O fetch
também está embutido no Deno; não há necessidade de outro módulo como no Node.js.Também agrupamos todo o conteúdo da função com um
try..catch
para nos informar se houver algum erro.Se tudo correr bem, retornaremos um status de
201
e um response.body
.Por último, exportaremos esta função para ser usada em nosso arquivo
routes.ts
. Então, vamos fazer isso a seguir.Vamos testar nossa rota de criação. Para iniciar o servidor, executaremos o seguinte comando:
deno run --allow-net --allow-read server.ts
Como mencionado anteriormente, o Deno é bloqueado por padrão. Temos de especificar que o acesso à rede é permitido usando o sinalizador
--allow-net
e que o acesso de leitura ao diretório do projeto é permitido para ler nossas variáveis ambientais usando o sinalizador--allow-read
.Agora nosso servidor deve estar escutando na porta 3000. Para testar, podemos usar Postman, Insoniaou o meu favorito, a extensãoThophyllum Client no VS Code.
Faremos uma solicitação
POST
paralocalhost:3000/api/todos
e incluiremos no body
da nossa solicitação o JSON document que queremos adicionar.💡 Normalmente, eu não criaria um ID manualmente. Eu confiaria no ObjectID gerado pelo MongoDB,
_id
. Isso exigiria a adição de outro módulo Deno a este projeto para converter o BSON ObjectId. Eu queria manter este tutorial o mais simples possível.Se tudo correr bem, receberemos uma resposta bem-sucedida.
Agora vamos para as rotas de leitura. Começaremos com uma rota que obtém todos os nossos todos chamados
getTodos
.Este será direcionado para o MongoDB Atlas Data API
find
. Não passaremos nada além de dataSource
, database
e collection
para nosso query
. Isto retornará todos os documentos da collection especificada.Em seguida, precisaremos adicionar essa função às nossas exportações na parte inferior do arquivo.
Em seguida, adicionaremos essa função e rota ao nosso arquivo
routes.ts
também.Como fizemos alterações, precisaremos reiniciar nosso servidor usando o mesmo comando de antes:
deno run --allow-net --allow-read server.ts
Para testar essa rota, enviaremos uma solicitação
GET
paralocalhost:3000/api/todos
desta vez, sem nada em nossa solicitação body
.Desta vez, devemos ver o primeiro documento que inserimos em nossa resposta.
Em seguida, configuraremos nossa função para ler um único documento. Chamaremos isso
getTodo
.Essa função utilizará o
findOne
endpoint Data API e, dessa filter
vez, passaremos para nosso query
.Usaremos a consulta
params
do nosso URL para obter o ID do documento pelo qual filtraremos.Em seguida, precisamos exportar essa função também.
Importaremos a função e configuraremos nossa rota no arquivo
routes.ts
.Lembre-se de reiniciar o servidor. Esta rota é muito semelhante à rota "read all documents ". Desta vez, precisaremos adicionar um ID ao nosso URL. Vamos usar:
localhost:3000/api/todos/1
.Devemos ver o documento com
todoId
de 1.} Para testar ainda mais, tente adicionar mais documentos de teste utilizando o método
POST
e, em seguida, execute os dois métodosGET
novamente para ver os resultados.Agora que temos documentos, vamos configurar nossa rota de atualização para nos permitir fazer alterações nos documentos existentes. Chamaremos essa função
updateTodo
.Esta rota aceitará três argumentos:
params
, request
e response
. O params
nos dirá qual documento atualizar e o request
nos dirá o que atualizar.Usaremos o
updateOne
Atlas Data API e definiremos filter
e update
em nosso query
.O
filter
indicará o documento que está sendo atualizado e o update
usará o operador$set
para atualizar os campos do documento.Os dados atualizados virão de nosso
request.body
.Vamos exportar esta função na parte inferior do arquivo.
Importaremos a função e configuraremos nossa rota no arquivo
routes.ts
.Essa rota usará o método
PUT
.Lembre-se de reiniciar o servidor. Para testar esta rota, usaremos uma combinação dos testes anteriores.
Nosso método será
PUT
. Nossa URL será localhost:3000/api/todos/1
. E incluiremos um JSON document em nosso body
com os campos atualizados.Nossa resposta desta vez indicará se um documento foi encontrado ou correspondido e se foi feita uma modificação. Aqui vemos que ambos são verdadeiros.
Se executarmos uma solicitação
GET
nesse mesmo URL, verá que o documento foi atualizado!A seguir, configuraremos nossa rota de exclusão. Chamaremos este de
deleteTodo
.Essa rota usará o
deleteOne
Data API endpoint e filter
usará o URL params
.Vamos exportar esta função.
E nós o importaremos e configuraremos sua rota no arquivo
routes.ts
.Lembre-se de reiniciar o servidor. Este teste usará o método
DELETE
. Excluiremos o primeiro a fazer usando esta URL: localhost:3000/api/todos/1
.Nossa resposta indicará quantos documentos foram excluídos. Nesse caso, devemos ver que um foi excluído.
Vamos criar mais uma rota de treinamento. Este demonstrará um pipeline de agregação básico usando o MongoDB Atlas Data API. Chamaremos isso
getIncompleteTodos
.Para essa rota, usaremos o endpoint
aggregate
Data API endpoint. Esse endpoint aceitará um pipeline
.Podemos passar qualquer pipeline de agregação por esse endpoint. Nosso exemplo será básico. O resultado será uma contagem de Todos incompletos.
Vamos exportar esta função final.
E vamos importá-lo e definir nossa rota final no arquivo
routes.ts
.Lembre-se de reiniciar o servidor. Este teste utilizará o método
GET
e esta URL: localhost:3000/api/todos/incomplete/count
.Adicione alguns test Todos ao banco de dados e marque alguns como completos e outros como incompletos.
Nossa resposta mostra a contagem de todos incompletos.
Criamos um servidor Deno que usa a API de dados do MongoDB Atlas para criar, ler, atualizar e excluir documentos (CRUD) em nosso banco de dados MongoDB. Adicionamos uma rota bônus para demonstrar o uso de um pipeline de agregação com a MongoDB Atlas Data API. E agora?
Se quiser ver o código concluído, você pode encontrá-lo aqui. Você deve ser capaz de usar isso como ponto de partida para seu próximo projeto e modificá-lo para atender às suas necessidades.