Criando Um Servidor Em Node Com Express
Muito se fala sobre utilizar JavaScript para criar servidores de back-end, mas afinal, por onde podemos começar? Para exemplo do post vou estar utilizando o NodeJS.
Para quem não conhece, o NodeJS é um interpretador de código JavaScript que funciona no lado no servidor (back-end), com isso é possível criar servidores baseando-se apenas em JavaScript, sim, podemos trocar nossos back’s escritos em Java, PHP ou Ruby por NodeJS.
Instalando o NodeJS
Como a instalação pode estar sendo realizada de diferentes maneiras, baseado no sistema operacional da máquina não irei estar abordando esse assunto (talvez em um post específico para isso).
Para realizar a instalação podemos acessar o link: download, escolha o seu sistema operacional e faça o download, após a conclusão do download prossiga com a instalação.
Criando nosso primeiro projeto com NodeJS
Agora, se tudo deu certo, já podemos começar a criar nosso primeiro projeto em NodeJS, para exemplo do post vamos utilizar o terminal ou cmd (no windows).
Para começarmos o nosso primeiro projeto, vamos criar uma pasta em nossa área de trabalho (desktop) chamada meu-primeiro-servidor-nodejs
.
Obs: Eu escolhi esse nome apenas para exemplo do post, vocês podem estar optando pelo nome que quiserem.
Em seguida, através do terminal, devemos navegar até a pasta criada:
Pronto, até o momento estamos dentro de uma pasta chamada meu-primeiro-servidor-nodejs
, porém, em nenhum momento informamos do que se trata a mesma, e como vocês já devem estar imaginando, o NodeJS não é um Jedi para adivinhar que essa pasta vai ser nosso primeiro projeto.
Mas afinal, o que podemos fazer para transformar essa pasta normal em um projeto Node?
Para isso devemos executar o comando npm init
:
Veja que informamos apenas a description (descrição) e author (autor), o resto apenas deixamos o valor padrão que o Node informa e no fim, confirmamos que tudo estava certo.
Tudo certo, mas da onde veio esse tal de npm
? Pois é, acabei não falando antes pois preferí descrevê-lo apenas no momento do seu uso.
Conhecendo o gerenciador de pacotes do NodeJS
Assim como o Java possuí o Maven para gerenciar as dependências de forma ágil dos seus projetos o NodeJS possuí seu próprio gerenciador, o famoso NPM (Node Package Manager), com ele conseguimos atualizar dependências ou instalá-las.
Para conferir todas as possibilidades de download podemos ver através do seu site: npm
Package.json, o que é isso?
Caso você seja uma pessoa curiosa já deve ter visto que o npm
criou um arquivo na raiz da nossa pasta chamado package.json
, mas afinal, para que ele serve? É nele que fica todas as informações do nosso projeto, tais como: nome, versão, palavras chaves, autor, repositório, etc…
{
"name": "meu-primeiro-servidor-nodejs",
"version": "1.0.0",
"description": "Meu primeiro servidor",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Matheus Castiglioni",
"license": "ISC"
}
Este é o exemplo do package.json
criado para o meu projeto.
Criando o nosso servidor
Agora que já temos nosso projeto criado e configurado, vamos começar a criar nosso servidor, o primeiro passo é criar o arquivo responsável por configurar e subir o servidor, podemos criar um arquivo chamado servidor.js
na raiz do nosso projeto.
Para subir e configurar o servidor, vamos utilizar um módulo do NodeJS chamado http
, podemos começar fazendo o require
(importação) dele:
const http = require("http");
O módulo http
é responsável por criar e subir um servidor, mas, qual servidor ele irá subir? Sim, até agora não criamos nenhum servidor, como essa é uma tarefa um tanto quanto chata, vamos utilizar um framework chamado Express
, ele facilita muito nossa vida quanto estamos trabalhando com servidores para a web.
O primeiro passo, assim como fizemos com o http
devemos fazer o require
dele também:
const express = require("express");
Estamos realizando o require
tanto do http
quanto do express
, mas de onde eles estão vindo? Será que existe alguma mágica para eles aparecem em nosso projeto?
Lembra quando falamos sobre o npm
? Pois é, ele é o responsável por realizar o download de nossas dependências, mas, até agora não informamos elas em nenhum lugar, como podemos fazer isso?
Baixando dependências
Para realizar o download e instalação de nossas dependências, podemos fazer através do comando npm install
seguido pelo nome da mesma:
npm install express --save
Poderíamos utilizar um atalho de install para apenas i
npm i express --save
Mas afinal, que treco é esse de --save
? Simples, quando adicionamos o --save
estamos dizendo para o npm
:
Olha npm, baixa e instala para mim a dependência que se chama express e salva ela em nosso package.json
Lembram do package.json
? Sim, ele é o responsável por manter todas as informações de nosso projeto, reparem agora que ele terá um valor a mais dependencies (dependências), onde são informadas todas as dependências que o projeto precisa para rodar.
{
"name": "meu-primeiro-servidor-nodejs",
"version": "1.0.0",
"description": "Meu primeiro servidor",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Matheus Castiglioni",
"license": "ISC",
"dependencies": {
"express": "^4.16.2"
}
}
Conhecendo o node_modules
Se novamente você foi curioso e deu uma olhada na estrutura do nosso projeto, deve ter reparado que foi criado uma pasta chamada node_modules, afinal, qual a utilidade dela? É nela que contém os módulos que podem ser importados (ou requerídos através do require) para serem utilizados em nosso projeto.
Agora nosso require já deve funcionar porque baixamos e instalamos o express
, não baixamos ou instalamos o http
porque por padrão ele já vem com o NodeJS.
Subindo o servidor
Agora que já temos tudo que precisamos vamos de fato subir nosso servidor.
Conforme dito anteriormante, para subir nosso servidor vamos utilizar o módulo do http
, através dele temos uma função chamada createServer
onde devemos passar um servidor para ele, mas, quem será nosso servidor? Sim, se você pensou no express
parabéns, você acertou.
http.createServer(express);
Será que só isso é suficiente para subir nosso servidor?
Reparem que através do comando node
pediso para ele interpretar arquivos JavaScript, passando como argumento (parâmetro) o nome do arquivo. Porque nosso comando executou e já finalizou?
O que está acontecendo é que o NodeJS esta interpretando nosso arquivo de forma correta, ele cria o servidor e logo em seguida o derruba, porque não pedimos para o servidor ficar rodando.
Rodando o servidor
Como podemos fazer para que nosso servidor fique rodando eternamente até o mesmo ser parado? Para isso temos a função listen
do http
, ela recebe como primeiro parâmetro a porta que o servidor ficará escutando (aguardando requisições) e como segundo parâmetro devemos passar uma função de callback (que será executada após o servidor estiver rodando).
http.createServer(express).listen(3000, () => console.log("Servidor rodando local na porta 3000"));
Vejam que foi passado a porta 3000 para nosso servidor ficar escutando e como segundo parâmetro foi passado uma arrow function responsável apenas por fazer um log nos informando que o servidor está rodando na máquina local na porta 3000.
Nosso arquivo servidor.js
completo fica da seguinte maneira;
const http = require("http");
const express = require("express");
http.createServer(express).listen(3000, () => console.log("Servidor rodando local na porta 3000"));
Agora quando pedimos para o NodeJS rodar nosso arquivo, teremos a seguinte saída:
Reparem que o servidor ficou rodando, para pará-lo eu tive que executar o comando CTRL+C.
Testando o servidor
Pronto, até o momento nosso servidor já esta subindo localmente na porta 3000, vamos testá-lo?
Ué, porque deu esse erro:
Cannot GET /
Até o momento criamos e subimos nosso servidor, porém, em qual momento definimos as rotas, ou seja, as URL’s que podemos acessar? Pois é, não definimos, então vamos resolver o problema.
Definindo a rota de nosso servidor
Para exemplo do post vamos definir apenas a rota principal, em outras palavras, a rota raiz, que é acessada quando informamos apenas a porta.
O primeiro passo será criar uma app
, podemos fazer isso executando uma função que o express
possuí:
const app = express();
Com isso já temos nossa app
, agora precisamos configurar nossa primeira rota, para essa necessidade temos a função .get
, que recebe dois parâmetros, sendo eles: o path que será acessado e uma função de callback para processar a requisição:
app.get("/", function(req, res) {
res.send("<h1>Servidor rodando com ExpressJS</h1>");
});
Aqui estamos dizendo:
Olha Express, quando alguém realizar uma requisição do tipo get para a raiz (informando apenas a porta), pegue a resposta (res) e envie (send) uma tag h1 com o conteúdo “Servidor rodando com ExpressJS”.
Agora por último, na função createServer
devemos passar agora o app
e não mais o express
:
http.createServer(app).listen(3000, () => console.log("Servidor rodando local na porta 3000"));
Nosso arquivo servidor.js
completo fica com a seguinte estrutura;
const http = require("http");
const express = require("express");
const app = express();
app.get("/", function(req, res) {
res.send("<h1>Servidor rodando com ExpressJS</h1>");
});
http.createServer(app).listen(3000, () => console.log("Servidor rodando local na porta 3000"));
Agora, vamos testar nosso servidor novamente:
E ta lá, tudo funcionando corretamante \o/
Para mais opções de criação de rota, confira a documentação de roteamento
O projeto de exemplo pode ser encontrado aqui.
Já tinha ouvido falar do Express? Não deixe de comentar.