Introdução ao NodeJs

nodejs
javascript
servidor
Introdução ao NodeJs cover image

Introdução

Ao tentar aprender sobre web

desenvolvimento, geralmente descobrimos que o front-end é significativamente mais acessível do que o back-end. Há muitos motivos para isso, principalmente a sensação de feedback instantâneo que surge ao alterar um determinado elemento de uma página no código e perceber a alteração sendo aplicada ao site. Esse feedback costuma ser útil para iniciantes, pois permite que ajustem seu código e aprendam com seus erros. Infelizmente, não é o caso do back-end: muitas vezes, uma quantidade significativa de trabalho é dedicada à configuração inicial do ambiente e à instalação das dependências necessárias para que uma simples mensagem “Hello World” apareça no terminal., muito progresso está sendo feito constantemente na comunidade de código aberto para facilitar o processo de desenvolvimento de frameworks, e melhorar a experiência do desenvolvedor NodeJs é um bom exemplo disso. Este framework é uma tecnologia muito capaz que torna a escrita no lado do servidor. código em Javascript é conveniente e oferece uma variedade de ferramentas e recursos integrados que o diferenciam de seus concorrentes. Neste artigo, exploraremos NodeJs e seu ecossistema, com uma abordagem prática, construindo um projeto totalmente funcional.

O que vamos construir?

Os aplicativos ToDo são um projeto ideal para iniciantes que estão aprendendo desenvolvimento front-end. É por isso que decidimos construir uma API de lista de tarefas. Isso nos permitirá adicionar persistência de dados à nossa interface e nos dará a capacidade de manipular esses dados (adicionando, atualizando, excluindo todos, etc….).

O código final pode ser encontrado aqui.

Nossas ferramentas

Usaremos uma pilha de tecnologia simplificada para este projeto. Pode ser considerado uma versão mínima de muitas ferramentas que você encontrará em projetos da vida real, porque as ideias de nível superior são as mesmas. Os detalhes de implementação e escolha de uma ferramenta específica em detrimento de outra não são importantes para começar.

  • NodeJs, como mencionamos, é um dos frameworks Javascript mais populares para construção de aplicações server-side.

  • ExpressJs é uma estrutura Javascript mínima usada em cima do NodeJS. Ele acelera o processo de desenvolvimento usando muitos recursos integrados. Também é utilizado como forma de padronizar as práticas de desenvolvimento em projetos NodeJS, a fim de facilitar seu uso pelos engenheiros.

  • LowDB é um banco de dados simples na memória. Sua simplicidade nos permite mostrar como interagir com um banco de dados em um projeto NodeJs, sem tratar de assuntos mais avançados como implantações e configurações.

Agora que identificamos todas as ferramentas que usaremos, vamos aos nossos teclados e começar a codificar!

Instalação

O nó está disponível em todas as plataformas. Todos os guias de instalação podem ser encontrados no site oficial. Os usuários do Windows devem adicionar o nó caminho para variáveis ​​de ambiente para que ele possa ser usado na linha de comando.

Também precisaremos do npm instalado. Npm é o gerenciador de pacotes padrão para NodeJs. Isso nos permitirá gerenciar as dependências do projeto. O guia de instalação pode ser encontrado aqui.

Inicialização do projeto

Acesse o link e clone o projeto inicial:

Este é um repositório inicial simples para o nosso projeto. Ele contém todas as dependências que usaremos junto com a estrutura de arquivos do projeto. Explicaremos cada elemento assim que alcançado. Abra seu terminal, navegue até o caminho do projeto e execute o comando:

npm install

Isso instalará todas as dependências do projeto especificadas no arquivo package.json. package.json é o arquivo encontrado na raiz de qualquer projeto Javascript/NodeJs, contém metadados sobre este último e é usado para gerenciar todas as dependências, scripts e versões do projeto.

Depois que todas as dependências estiverem instaladas, podemos iniciar nossa aplicação:

npm run start

“start” é um script que especificamos no pacote. arquivo json. Ele especifica o arquivo de entrada para nosso aplicativo, que em nosso caso é app.js.

A seguinte mensagem deve aparecer agora em seu terminal:

nodejs_1

Isso significa que nosso servidor foi iniciado com sucesso e está escutando quaisquer solicitações enviadas para a porta 3000. Vejamos app.js e explique o que está acontecendo aqui:

nodejs_2

App.js é o nosso arquivo de entrada do projeto (e o único neste momento). Instanciamos uma aplicação expressa chamada app, especificamos que todas as requisições que possuem o método http “GET” e o subcaminho '/' serão tratadas por esta rota, passamos uma função chamada middleware, que recebe o objeto de requisição e resposta como parâmetros. Isto é fundamental, pois a requisição contém todas as informações necessárias para que ela seja tratada (parâmetros, corpo da requisição, cabeçalhos da requisição, etc.), e o objeto de resposta é aquele que será retornado ao cliente. Começamos apenas enviando a mensagem “Olá mundo”. Depois disso, fazemos com que nosso aplicativo ouça quaisquer solicitações recebidas na porta especificada (no nosso caso, 3000) e registremos a mensagem “Listening to port 3000” para indicar que nosso aplicativo está funcionando e pronto para receber solicitações.

Abra seu terminal e na barra de links digite “localhost:3000/” e pressione Enter. Este é o caminho especificado que podemos usar para acessar nosso servidor localmente. Você receberá a seguinte mensagem:

nodejs_3

Configuração do banco de dados

Lowdb é um banco de dados de código aberto fácil de usar e não requer configuração específica. A ideia geral por trás disso é armazenar todos os dados em um arquivo JSON local. Após a instalação do LowDB (o que foi feito quando instalamos todas as dependências), podemos adicionar o seguinte código ao db.js:

nodejs_4

Este código é bastante semelhante ao encontrado na documentação oficial do LowDB. Nós o ajustamos um pouco para nosso próprio caso de uso. Vamos explicar linha por linha:

As primeiras linhas são para importar as dependências necessárias. “join” é uma função utilitária disponível no módulo “path”. É um dos módulos principais do NodeJs que oferece muitos métodos para lidar e manipular caminhos. “Low” e “JSONFile'' são as duas classes expostas pelo LowDB. O primeiro cria a instância do arquivo json que conterá nossos dados. O segundo cria a instância real do banco de dados que atuará sobre ela. Finalmente, “lodash” é uma das bibliotecas javascript mais utilizadas, oferecendo uma ampla variedade de funções utilitárias para tarefas comuns de programação. Nós o adicionamos à nossa instância de banco de dados para nos permitir usar seus métodos avançados para lidar com nossos dados.

Primeiro, especificamos o caminho para o arquivo db.json. É o arquivo que conterá nossos dados e será passado para o LowDB. Se o arquivo não for encontrado no caminho especificado, LowDB criará um.

Em seguida, passamos o caminho do arquivo para o adaptador LowDB e para nossa nova instância de banco de dados LowDB. A variável “db” pode então ser usada para se comunicar com nosso banco de dados. Depois que a instância do banco de dados é criada, lemos o arquivo json usando db.read(). Isso definirá o campo “dados” em nossa instância de banco de dados para que possamos acessar o conteúdo do banco de dados. Observe que precedemos esta linha com “await”. Isso especifica que esta instrução pode levar um tempo desconhecido para ser resolvida e que o processo NodeJs deve aguardar sua execução antes de prosseguir com o restante do código. Fazemos isso porque a operação de leitura requer acesso à memória do arquivo especificado, e o tempo para executar esse tipo de operação depende das especificações da sua máquina.

Agora que temos acesso ao campo de dados, definimos-o como um objeto contendo um array vazio de posts, ou melhor, verificamos se o arquivo contém algum dado anterior e definimos o array vazio se não for o caso.

Por fim, executamos db.write() para aplicar as modificações que fizemos nos dados e exportamos a instância do banco de dados para que possa ser usada em outros arquivos do nosso projeto.

Fluxo de trabalho geral de solicitação/resposta

Considere o seguinte diagrama:

nodejs_5

Ele mostra a arquitetura geral aplicada em uma infinidade de aplicativos backend construídos com NodeJs/Express. Compreender o fluxo de trabalho geral por trás do tratamento de uma solicitação não apenas permitirá que você construa e estruture aplicativos NodeJs, mas também transfira esses conceitos para praticamente qualquer pilha técnica de sua escolha. Exploraremos as diferentes camadas que interferem neste processo e explicaremos suas funções:

## Camada de solicitação HTTP

Esta é a primeira camada da nossa aplicação, imagine-a como um gateway que recebe uma ampla gama de diferentes solicitações vindas de diferentes clientes, cada solicitação é então analisada e encaminhada para a parte dedicada da aplicação para que seja tratada.

  • Roteadores: aqui estamos nos referindo aos roteadores Express, mas esse conceito pode ser encontrado em muitos frameworks backend. Os roteadores são uma forma de aplicar a distribuição lógica em nossa lógica de negócios ao nosso código, o que significa que cada conjunto de elementos que compartilham recursos semelhantes são tratados pela mesma entrada e podem ser separados do restante dos conjuntos. Isto tem a vantagem de tornar cada componente do código independente dos outros e mais fácil de manter e estender. Mais especificamente, e a título de exemplo, todas as solicitações que cumpram as condições do caminho da url partilhada “/posts” serão tratadas pelo mesmo router. Dependendo do método http (GET, POST, etc.), um controlador diferente será usado.

  • Controladores: um controlador recebe solicitações filtradas dos roteadores, aplica processamento adicional e chama os métodos de serviço adequados.

Camada de lógica de negócios

Essa camada é exclusiva dependendo dos casos de uso específicos do aplicativo e da lógica de negócios por trás dele.

  • Serviços: Serviços são um conjunto de métodos que contêm a lógica central da aplicação. Eles também interagem com o banco de dados por meio do uso de ORMs/ODMs.

  • Serviços de terceiros: muitas aplicações modernas optam por delegar uma parte da lógica da aplicação a serviços dedicados acessíveis através de uma API. Serviços deste tipo podem ser serviços de tratamento de pagamentos, armazenamento de arquivos estáticos, notificações e outros.

  • ODM/ORM: ORMs e ODMs atuam como intermediários entre os serviços e o banco de dados. Sua função é fornecer uma abstração de alto nível em um banco de dados que permita ao desenvolvedor escrever código na linguagem de programação de sua escolha, em vez de linguagens de banco de dados dedicadas, como SQL.

Camada de persistência de dados

  • Bancos de dados: como mencionamos anteriormente, quase todas as aplicações necessitam de alguma forma de persistência de dados. Esta parte é tratada por bancos de dados e dependendo da natureza dos dados, da lógica de negócio e de muitas outras considerações, a escolha de um determinado banco de dados em detrimento de outro é considerada crucial para a eficiência e escalabilidade da aplicação.

Exemplo: Adicionando uma postagem

Agora que entendemos a ideia geral por trás da arquitetura, vamos aplicá-la ao nosso exemplo simples. Implementaremos o recurso de adicionar uma postagem de tarefas ao nosso aplicativo. Vamos supor que qualquer postagem tenha um id único que nos permitirá identificá-la posteriormente em nosso banco de dados, um título que é uma string e uma ordem que é do tipo inteiro. Seguindo nosso diagrama, começaremos implementando o roteador. Adicione o seguinte código ao arquivo index.js:

Starting a server in ExpressJS

Este é o nosso arquivo do roteador. Importamos o método express e “addPost” do nosso controlador (implementaremos este em breve), criamos uma instância do roteador expresso e vinculamos o método addPost ao nosso roteador - o que significa que para cada solicitação que possui o caminho raiz e o http método “POST”, o método “addPost” será chamado para lidar com isso.

Antes de implementarmos nosso método no controlador, referenciamos o novo roteador em nosso arquivo app.js principal e especificamos seu caminho como “/posts”: Todas as rotas com os caminhos especificados serão encaminhadas para este roteador, para que possam ser tratadas pelos diferentes métodos de controlador:

Starting a server in ExpressJS

Importamos o roteador e o nomeamos como “postagens”. app.use(“/posts”,..) significa que todas as solicitações com o subcaminho “/posts”, independentemente do método http, serão roteadas para o roteador especificado.

Outras mudanças no app.js incluem a importação do arquivo de configuração do banco de dados para que ele seja executado e o uso de express.json() como middleware para nos permitir acessar o objeto do corpo da solicitação.

Agora que nossas rotas estão definidas, podemos adicionar o método “addPost” no arquivo controller.js:

Starting a server in ExpressJS

“addPost” é uma função de middleware que toma como parâmetros a solicitação, os objetos de resposta e a próxima função. Quando a próxima função for chamada, o processo passará para o próximo middleware da cadeia ou encerrará a solicitação. No código do método, extraímos o título e a ordem do corpo da solicitação e os passamos como parâmetros para a função de serviço “createPost”. Esta função pega os atributos do post, cria um novo post e o retorna. Assim que a nova postagem for criada, nós a devolvemos ao cliente junto com o código de status 200, significando que a solicitação foi bem-sucedida. Você pode notar que nosso código é colocado dentro de um bloco try/catch para capturar qualquer erro inesperado e passá-lo para o próximo middleware. É considerada uma prática recomendada anexar a todos os roteadores um middleware de tratamento de erros que extraia o erro e retorne uma mensagem de erro significativa ao cliente.

Tudo o que resta agora é implementar a função “createPost” em service.js:

nodejs_6

Como mencionamos anteriormente ao explicar as diferentes camadas da arquitetura, a camada de serviço interage com a solução de armazenamento de dados através do uso de ORM/ODM. No entanto, em nosso exemplo, não precisaremos usar um ORM separado, pois o Lowdb vem com suporte integrado para Javascript. Todos os detalhes sobre sua sintaxe podem ser encontrados na documentação.

O método “createPost” recebe título e ordem como parâmetros e os utiliza para criar o objeto post. Para o id único, utilizamos uma biblioteca dedicada chamada “nanoid”, que gera uma sequência única de caracteres. Adicionamos a nova postagem ao array posts no banco de dados e escrevemos essas alterações; a nova postagem é então retornada pela função.

Agora que “createPost” está pronto, o recurso de adição de postagens está concluído e instalado e funcionando. Testamos usando Postman, uma ferramenta popular para testar APIs:

nodejs_7

Selecionamos “POST” como o método http para a solicitação junto com o caminho de URL especificado “localhost:3000/posts”. Adicionamos o título e o pedido em formato json na seção body e enviamos a solicitação. Conforme mostrado acima, recebemos o status 200 OK junto com a postagem recém-criada.

Conclusão

Muitos conceitos e ideias foram explorados neste projeto: abordamos como instalar e configurar nosso ambiente de projeto, aprendemos como configurar LowDB para persistência de dados locais, exploramos a arquitetura geral de aplicativos backend NodeJS/Express e vimos como aplique-o em um exemplo simples. Por fim, testamos nosso aplicativo usando Postman.

A intenção aqui era expor uma versão simplificada de tudo o que envolve a construção de aplicativos back-end modernos. Como vimos anteriormente, NodeJs é uma ferramenta poderosa que nos permite construir APIs simples e complexas. Combinado com seu rico ecossistema de estruturas, como o express e uma infinidade de ferramentas e bibliotecas para praticamente qualquer caso de uso, é uma solução legítima para o desenvolvimento backend moderno - uma solução que recomendamos aprender e dominar.


Career Services background pattern

Serviços de carreira

Contact Section background image

Vamos manter-nos em contacto

Code Labs Academy © 2024 Todos os direitos reservados.