Construindo uma API RESTful em Deno com Oak e MongoDB
De acordo com a documentação oficial, Deno é um runtime simples, moderno e seguro para JavaScript e TypeScript que usa V8 e é construído em Rust. Ele oferece suporte a TypeScript e Vanilla JS prontos para uso e usa pacotes de terceiros com URLs compatíveis com o navegador para gerenciar módulos.
Por padrão, Deno é seguro, o que significa que não há acesso a arquivos, rede ou ambiente a menos que explicitamente habilitado. Para obter uma explicação completa sobre o que é Deno, como funciona e por que é tendência, leia mais aqui .
Neste artigo, veremos como usar Oak e MongoDB com Deno para construir uma API da web RESTful, mas antes de fazermos isso, vamos revisar Oak e MongoDB.
O que é Oak?
Oak é uma estrutura de middleware para o servidor http do Deno que também inclui um middleware de roteador, ambos fortemente inspirados em Koa . Oak é a estrutura de middleware mais popular escolhida quando se trata de criar aplicativos da web com Deno.
O que é MongoDB?
MongoDB é um programa de banco de dados de plataforma cruzada e orientado a documentos usado por desenvolvedores para lidar com dados de aplicativos. O MongoDB armazena dados em documentos semelhantes a JSON para otimizar a produtividade do desenvolvimento.
Adicionaremos MongoDB em nosso exemplo a seguir, mas recomendo verificar este artigo para obter informações de configuração mais detalhadas.
Demonstração: usando Deno para construir uma API REST simples
Para obter o máximo das seções a seguir, este tutorial assume alguns requisitos:
- Compreensão de JavaScript/TypeScript
- Deno instalado em sua máquina (guia de instalação aqui )
- Um editor de texto de sua escolha
- Postman (para teste de API)
Objetivo: criar uma API REST com operações CRUD
Estaremos construindo uma API REST simples que nos permitirá realizar operações CRUD básicas.
| MÉTODO | URL | Descrição |--------|---------------|-------------------------------| | GET |/quartos | Retornar todos os quartos do DB | | GET |/quartos/: id | Voltar um quarto individual | | POST |/quartos | Crie uma nova sala | | PUT |/quartos/: id | Atualizar sala existente | | DELETE |/quartos/: id | Excluir sala |
Criando um Deno s erver com Oak
Primeiro, criaremos um arquivo chamado server.ts
. Então, iremos criar um servidor Deno e importar nosso Roteador
do Oak. A seguir, criaremos nossas funções de middleware de rota usando a estrutura de middleware Oak.
Veja abaixo:
//server.ts import {Application, Router} de"https://deno.land/x/oak/mod.ts"; //essas funções ainda não existem, vamos criá-las mais tarde import {getAllRooms, createRooms, getRoom, updateRoom, deleteRoom} de'./routes.ts' const app=new Application (); roteador const=novo roteador (); porta const: número=8000; router.get ('/', (ctx)=> { ctx.response.body='Olá de Deno' }) //essas funções ainda não existem, vamos criá-las mais tarde .get ('/rooms', getAllRooms) .get ('/rooms/: id', getRoom) .post ('/rooms', createRooms) .put ('/rooms/: id', updateRoom) .delete ('/rooms/: id', deleteRoom) //Aqui, estamos dizendo ao nosso aplicativo para usar o roteador app.use (router.routes ()); app.use (router.allowedMethods ()) app.listen ({port}) console.log (`Servidor está rodando na porta $ {port}`);
Nas linhas 6 e 7, inicializamos nosso aplicativo e importamos o roteador dos módulos Oak.
Na linha 9, configuramos uma resposta Hello from Deno
quando uma solicitação é feita para a raiz de nossa API.
Na linha 10, fizemos isso de modo que nosso retorno de chamada aceite um parâmetro chamado ctx
, abreviação de contexto. Para referência,”contexto”no Oak representa a solicitação atual enviada por meio do middleware do Oak.
Finalmente, nosso aplicativo será executado na porta 8000
.
A dding MongoDB
Para configurar o MongoDB, vamos criar um arquivo mongodb.ts
e adicionar as seguintes linhas de código:
import {MongoClient} de"https://deno.land/x/[email protected]/mod.ts"; cliente const=novo MongoClient (); client.connectWithUri ("mongodb + srv://: @ cluster0.6lbak.mongodb.net/deno-oak? retryWrites=true & w=maioria"); const db=client.database ('denoOakApi') exportar banco de dados padrão;
Como você verá, nossa primeira etapa é importar o MongoClient
do pacote de driver Deno MongoDB, seguido pela inicialização e conexão ao nosso banco de dados hospedado.
Executar operações b asic CRUD
Agora estamos prontos para tentar realizar operações CRUD básicas que nos permitirão criar, ler, atualizar e excluir dados em nosso banco de dados MongoDB usando Deno e Oak.
Lendo d ata
Primeiro, criaremos um arquivo chamado routes.ts
e adicionaremos as seguintes linhas de código:
importe {RouterContext} de"https://deno.land/x/oak/mod.ts"; import db de'./mongodb.ts' const roomsCollection=db.collection ('quartos'); const getAllRooms=async (ctx: RouterContext)=> { const rooms=await roomsCollection.find () ctx.response.body=quartos }
Agora podemos testar nossa API usando o Postman. Para executar o aplicativo, navegue até a raiz do seu diretório de trabalho e execute o seguinte comando no seu terminal:
deno execute--allow-net--allow-plugin--allow-read--allow-write--unstable server.ts
Agora, abra o Postman e faça uma solicitação GET
para localhost: 8000/rooms
. Se feito corretamente, você deve obter um array vazio (veja abaixo). Isso ocorre porque ainda não adicionamos nenhum dado ao nosso banco de dados.
Criando d ata
Para ler dados, primeiro deve haver dados para ler. No bloco de código abaixo, nos prepararemos para adicionar dados ao nosso banco de dados:
const createRooms=async (ctx: RouterContext)=> { const {room_number, size, price, isAvailable}=await ctx.request.body (). value; sala const: qualquer={ número do quarto, Tamanho, preço, está disponível } const id=await roomsCollection.insertOne (room) room._id=id; ctx.response.status=201 ctx.response.body=room }
Observe que na linha 2, desestruturamos room_number
, size
, price
e isAvailable
do corpo de nossa solicitação e, em seguida, inseriu os respectivos valores em nosso roomsCollection
no banco de dados MongoDB. Na linha 11, enviamos um status 201 que retornará a sala recém-criada para o usuário.
Para testar esta função, podemos criar uma nova sala no Postman. Para fazer isso, faça uma solicitação POST
para localhost: 8000/rooms
após adicionar os seguintes dados ao corpo da sua solicitação:
{ "room_number": 214, "tamanho":"18 por 22 pés", "preço": 450, "isAvailable": false }
Agora temos nossos dados recém-criados com um id exclusivo.
Obtendo um s único d ocumento
Neste exemplo, vamos recuperar uma única sala por seu id. Para fazer isso, obteremos o id do documento no param
da solicitação-conforme demonstrado na linha 3 abaixo. Finalmente, vamos consultar nosso banco de dados MongoDB para encontrar o documento onde o valor de _id
é o mesmo que o valor vindo de ctx.params.id
const getRoom=async (ctx: RouterContext)=> { //obtém o id do documento do objeto params const id=ctx.params.id const room=await roomsCollection.findOne ({_id: {$ oid: id}}) ctx.response.body=room }
Para testá-lo no Postman, faça uma solicitação GET para localhost:8000/rooms/
Atualizando existente d ata
Para atualizar um documento existente, precisamos obter o id do documento e chamar $ set
nos campos que desejamos atualizar. Usar $ set
é a chave aqui; sem $ set
, excluiríamos todos os outros campos não especificados em nossa base de código.
const updateRoom=async (ctx: RouterContext)=> { //obtém o id do documento do objeto params const id=ctx.params.id const {room_number, size, price, isAvailable}=await ctx.request.body (). value; const {modedCount}=await roomsCollection.updateOne ({_id: {$ oid: id}}, { $ set: { preço, está disponível } }) //Se o id não existe na coleção, retornamos um status 404 e enviamos uma mensagem personalizada if (! disabledCount) { ctx.response.status=404; ctx.response.body={mensagem:'Sala não encontrada'} Retorna; } ctx.response.body=await roomsCollection.findOne ({_id: {$ oid: id}}) }
Para testar a API no Postman, faça uma solicitação PUT para localhost:8000/rooms/
Excluindo d ata
O processo de exclusão de dados de nossa coleção MongoDB com Deno e Oak é bastante simples.
Depois de obter o id do documento dos parâmetros com ctx.params.id
(como fizemos no exemplo anterior), tudo o que resta a fazer é chamar o MongoDB deleteOne
em nossa coleção e passe o id do documento que queremos excluir.
const deleteRoom=async (ctx: RouterContext)=> { const id=ctx.params.id const room=await roomsCollection.deleteOne ({_id: {$ oid: id}}); if (! sala) { ctx.response.status=404; ctx.response.body={mensagem:'Sala não encontrada'} Retorna; } ctx.response.status=204; }
Conclusão
Neste artigo, implementamos uma API RESTful criando um aplicativo CRUD simples usando o framework Deno, Oak. Também conectamos nosso aplicativo Deno ao MongoDB.
Como era de se esperar, o que cobrimos apenas arranha a superfície do que pode ser alcançado com o tempo de execução Deno e o framework Oak. Para praticar mais, leia este tutorial sobre como construir APIs RESTful usando Deno e Postgres. Para obter mais informações sobre o Deno, leia sua documentação oficial .
Deixe-me saber na seção de comentários abaixo o que você achou deste tutorial. Sou social no Twitter e no GitHub . Obrigado por ler e fique ligado.
A postagem Construindo um RESTful API em Deno com Oak e MongoDB apareceu primeiro no LogRocket Blog .