Introdução
Javascript é uma das linguagens de programação mais utilizadas no mercado atualmente. Com ela, é possível criar interfaces ricas de diversos tipos, tornando os sites dinâmicos e agradáveis para os usuários. Nodejs é o JavaScript executado no lado do servidor, proporcionando um ambiente de execução com uma ampla variedade de recursos e bibliotecas que facilitam o desenvolvimento de aplicativos de servidor escaláveis e eficientes.
Por que devo aprender Nodejs?
Se você está familiarizado com JavaScript, o Nodejs pode ser uma ótima escolha para iniciar seus estudos em desenvolvimento backend, já que ele utiliza essa linguagem como principal. O Nodejs é reconhecido pela sua escalabilidade e capacidade de lidar com múltiplas conexões simultâneas em tempo real, o que o torna uma excelente opção para sistemas como jogos online, chatbots, aplicativos de mensagens instantâneas e muitos outros!
Primeiros passos para iniciar o desenvolvimento
Para iniciar o seu projeto em Nodejs, é necessário instalá-lo em seu computador seguindo o guia de instalação disponível no site oficial. Após a instalação, o Node Package Manager (npm) estará disponível no seu computador e com ele você poderá instalar e configurar as bibliotecas JavaScript necessárias para o funcionamento do seu projeto em Nodejs.
O próximo passo é criar a pasta do seu projeto. Neste exemplo, vamos criar uma pasta chamada “tutorial-node”. Navegue até essa pasta e, no terminal do seu sistema operacional, digite o comando npm init -y
. Esse comando criará um arquivo chamado package.json com a seguinte estrutura:
Esse arquivo é necessário, pois nele ficarão armazenadas as informações sobre o projeto, suas dependências, a versão do Nodejs, scripts personalizados e outras configurações relacionadas. Por exemplo, a chave “name” possui o valor “tutorial-node”, que especifica o nome do pacote ou projeto. Esse nome é um identificador único usado para identificar o pacote em registros públicos e para referenciá-lo em outros projetos.
A chave “scripts” permite definir scripts personalizados a serem executados no pacote. Conforme o seu projeto em Nodejs avança, esse arquivo pode crescer e receber outras chaves e valores, incluindo dependências adicionais, comandos de build, testes e muito mais.
O arquivo package.json é fundamental para a configuração e gerenciamento do seu projeto em Nodejs, fornecendo informações essenciais sobre o mesmo e permitindo a personalização de scripts e outras configurações necessárias para o desenvolvimento e execução adequados do projeto.
Express: Um framework web ideal para o seu projeto em NodeJs
No próximo passo deste tutorial, vamos aprender a instalar e configurar o Express. Com o Express você poderá gerenciar as rotas do seu sistema para diferentes métodos HTTP, como PUT, GET, POST e DELETE, e criar um CRUD na sua aplicação Nodejs, além de lidar com middlewares, renderização de views e muito mais.
Ainda no terminal do seu sistema operacional, dentro da pasta do projeto, digite o comando npm install express. Se tudo ocorrer bem, o seu projeto terá uma nova pasta chamada “node_modules”, onde ficarão armazenadas as bibliotecas e dependências do seu projeto. Além disso, um novo arquivo chamado “package-lock.json” será criado, contendo as versões exatas de todas as dependências do projeto e no terminal será exibida a seguinte mensagem:
Essa mensagem indica que o pacote “express” foi instalado com sucesso, juntamente com suas dependências, e o número de pacotes adicionados pode variar dependendo das dependências do Express.
Agora, se você observar o arquivo package.json, verá que uma nova chave chamada “dependencies” foi adicionada. Essa chave será usada para armazenar todas as dependências que você instalar no seu projeto, juntamente com suas respectivas versões.
Configurando seu primeiro servidor em NodeJs
Primeiro, crie um arquivo na pasta do seu projeto com o nome exato que você atribuiu à chave “main” no arquivo package.json. Neste exemplo, usamos o arquivo “index.js“. Em seguida, abra este arquivo e escreva a estrutura de código a seguir:
Para entender esse código, vamos começar pela primeira instrução na linha 1. Nela, estamos importando o módulo express. Ao utilizar o recurso require(‘express’), o NodeJs irá procurar pelo pacote ‘express’ na pasta nodo_modules, assim você terá acesso às funções e aos recursos fornecidos pelo módulo express ao longo do seu seu código.
Na linha 3, declaramos a constante “server”, criando uma instância do servidor web. Através dessa instância, podemos utilizar os métodos e recursos do servidor Express. Como podemos ver nas linhas 5 e 11, definimos o método GET para a rota ‘/primeira-rota‘. Isso significa que quando você acessar a rota ‘localhost:3000/primeira-rota‘ no seu navegador, a função de callback definida será executada.
Dentro da função de callback, temos dois parâmetros: “req” e “res“. O objeto “req” representa a solicitação HTTP feita pelo cliente, enquanto o objeto “res” representa a resposta HTTP que será enviada de volta ao cliente. Neste caso, a função simplesmente retorna a resposta “Hello, world!”.
Na linha 11, utilizamos o método “listen” do objeto “server” para iniciar o servidor e ouvir as solicitações na porta especificada. Quando o servidor é iniciado com sucesso, a função de callback definida como segundo argumento é executada. Neste caso, a função exibe mensagens de log informando que o servidor está ouvindo na porta especificada e exibe a URL do servidor.
Para executar esse código, você pode digitar o comando node index.js
no terminal para iniciar o servidor. Em seguida, você pode acessar a rota ‘localhost:3000/primeira-rota‘ no seu navegador e ver a resposta “Hello, world!” sendo exibida. No terminal você deverá ver a mensagem a seguir:
Se você quiser mudar o código para testar novos conceitos, no terminal digite control + c e após isso digite novamente node index.js para atualizar o servidor.
Req e Res: Trabalhando com requisições
Quando você faz uma requisição ao servidor em uma determinada rota, este, por sua vez, te dá uma resposta. Em NodeJs, utilizamos os objetos req e res como parâmetros da função call-back para que possamos, assim, enviar um conteúdo para o usuário e tratar dados que este enviou.
O objeto req é utilizado para acessar e tratar os dados enviados na requisição pelo cliente. Ele contém informações como parâmetros da URL, já o objeto res é utilizado para enviar os dados tratados que vieram na requisição. Com ele, podemos definir o conteúdo da resposta, o código de status HTTP, os cabeçalhos da resposta e outras informações relevantes. No exemplo a seguir podemos observar duas formas de uso:
No primeiro exemplo, a rota do tipo GET /primeira-rota irá responder um conteúdo em HTML quando o usuário fizer a requisição. A resposta é um formulário HTML que será exibido no navegador do usuário. O formulário contém um campo de entrada de texto para o nome e um botão de envio.
No segundo exemplo temos uma nova rota definida como /perfis/:nome?, onde o parâmetro nome é passado na URL. O :nome indica que essa parte da URL é um parâmetro variável, ou seja, pode ser substituída por qualquer valor. O ponto de interrogação após o nome indica que esse parâmetro é opcional. Você pode testar esse código digitando localhost:3000/perfis/nome substituindo a palavra nome por seu nome.
Uma outra forma de enviar dados pela URL será mostrada a seguir:
Para testar esse código, novamente digite control + c e em seguida node index.js no terminal, e no navegador digite a rota localhost:3000/perfis/?nome=Marcos&sobrenome=Silva, essa forma de enviar dados pela URL se chama de query strings.
Usamos o ponto de interrogação para iniciar o objeto e definimos os elementos utilizando uma chave e um valor. Para acessar o conteúdo dessa query utilizamos a sintaxe req.query seguindo de .nome_da_chave. Em resposta, devolvemos para o usuário um pequeno conteúdo em HTML informando os dados que ele passou na URL.
Middlewares: Tratando a requisição antes de dar a resposta
Em NodeJs, utilizamos middlewares para atuar no caminho entre a requisição e a resposta, ou seja, uma função que é chamada no momento da requisição e baseado nesta, a middleware “decide” o que o servidor irá responder ao usuário. Vejamos um exemplo de uso de middlewares a seguir:
No código acima, na linha 6, temos um exemplo de middleware. A função server.use(express.urlencoded({ extended: true }))
é um middleware fornecido pelo pacote express que faz parte do processamento das requisições HTTP. O middleware express.urlencoded()
é responsável por analisar esses dados que vem no corpo da requisição e transformá-los em um formato que pode ser facilmente utilizado no servidor.
Em seguida, criamos a função validarLogin. Observe que a função recebe um novo parâmetro chamado next, ele é fundamental para que o servidor continue o processo e saia da middleware assim que ela terminar de ser executada. No fim, chamamos a função next(), para avançar para a rota seguinte.
Para testar esse middleware, utilizaremos o seguir:
No primeiro momento, temos a rota /login do tipo GET, quando o usuário fizer a requisição para esta rota, o servidor irá devolver para ele um formulário que simula um sistema de login. Quando o usuário submeter esse formulário, será redirecionado para a rota /perfil, observe que no perfil estamos utilizando a middleware validarLogin, que criamos anteriormente. Caso os dados enviados pelo usuário estiverem de acordo com o que definimos na middlware, este poderá acessar seu perfil com os dados fornecidos. Para isso utilizamos req.body o conteúdo que vem no corpo dessa requisição.
Conclusão
Como você pôde observar, o NodeJs oferece uma imensa gama de recursos para que possamos desenvolver aplicativos escaláveis para a web. Alguns desses recursos nós aprendemos neste tutorial, como algumas funções dos objetos req e res e a criação de Middlewares para deixar o sistema seguro e sofisticado.
Se você quiser aprender mais sobre Javascript, confira o nosso artigo Depuração de JavaScript: 5 dicas que irão agilizar o debug do seu código!, onde damos dicas para melhorar seu aprendizado em uma das linguagens de programação mais populares da web.