06 Configurando Servidor NodeJs
Configurando o servidor#
Nesta etapa iremos desenvolver o código que é responsável por configurar e iniciar um servidor HTTP utilizando o framework Express em Node.js. A classe App
cria uma instância do servidor Express e define os middlewares e rotas que serão utilizados.
Na função middlewares()
, é definido um middleware que faz o parsing das requisições para o formato JSON.
Na função routes()
, é definido o uso das rotas importadas do módulo ./controllers
para o caminho /api/v1
.
Por fim, a instância do servidor é exportada como um módulo Node.js, que pode ser utilizado em outros arquivos para iniciar o servidor com a chamada require('./app')
.
Um exemplo básico de como configurar um servidor HTTP utilizando o Express em Node.js:
// src/app.js
// Importa o framework Express
const express = require("express");
// Importa as rotas definidas no arquivo controllers.js
const routes = require("./controllers");
// Define a rota base para as APIs
routes.use('/api/v1', routes);
// Importa as configurações do banco de dados
require("./database");
class App {
constructor() {
// Inicializa o servidor
this.server = express();
// Configura os middlewares
this.middlewares();
// Configura as rotas
this.routes();
}
// Configura os middlewares utilizados pelo servidor
middlewares() {
// Configura o servidor para interpretar os dados enviados no formato JSON
this.server.use(express.json());
}
// Configura as rotas utilizadas pelo servidor
routes() {
// Define as rotas baseadas no arquivo controllers.js
this.server.use(routes);
}
}
// Exporta o servidor configurado e iniciado
module.exports = new App().server;
A classe App
é responsável por configurar o servidor, seus middlewares e rotas. A classe é inicializada no final do código e seu atributo server
é exportado para ser utilizado em outros arquivos.
A variável express
é responsável por importar o framework Express.
A variável routes
é responsável por importar as rotas definidas no arquivo controllers.js
.
A linha routes.use('/api/v1', routes)
define a rota base para todas as APIs definidas no arquivo controllers.js
. Neste caso, todas as rotas terão como prefixo a string /api/v1
.
A linha require("./database")
importa as configurações do banco de dados utilizado pela aplicação.
A função middlewares
é responsável por configurar os middlewares utilizados pelo servidor. Neste caso, o servidor é configurado para interpretar os dados enviados no formato JSON.
A função routes
é responsável por configurar as rotas utilizadas pelo servidor. Neste caso, o servidor é configurado para utilizar as rotas definidas no arquivo controllers.js
.
Por fim, a classe App
é exportada com seu atributo server
já iniciado, para que possa ser utilizada em outros arquivos.
Testando o servidor#
Após configurarmos o servidor em app.js
podemos criar um arquivo server.js
para inicializar o servidor e ouvir as requisições HTTP na porta especificada. O arquivo server.js
é o ponto de entrada da aplicação, onde podemos configurar variáveis de ambiente, inicializar o banco de dados e outros serviços, além de iniciar o servidor HTTP.
um exemplo básico de arquivo server.js
que utiliza o arquivo app.js
para configurar e iniciar o servidor:
// Importa o módulo que inicializa a aplicação
const app = require('./app');
// Define a porta em que o servidor irá escutar, utilizando a variável de ambiente "PORT" ou, caso não esteja definida, a porta 3000
const port = process.env.PORT || 3000;
// Inicia o servidor na porta especificada, e exibe uma mensagem no console para informar que a aplicação está sendo executada
app.listen(port, () => {
console.log(`Servidor iniciado na porta ${port}`);
});
Basicamente, este arquivo inicia o servidor na porta especificada utilizando o módulo app.js
que contém a definição da aplicação, e exibe uma mensagem no console para informar que o servidor foi iniciado com sucesso. Ele também utiliza a variável de ambiente PORT
, caso esteja definida, para especificar a porta em que o servidor irá escutar. Isso é útil quando a aplicação está hospedada em um ambiente em nuvem, como o Heroku, que pode especificar a porta em que a aplicação deve ser executada através dessa variável de ambiente. Caso a variável PORT
não esteja definida, o servidor irá escutar na porta 3000
por padrão.
Ao utilizar o server.js
, também podemos separar as configurações do servidor da lógica da aplicação em si, o que torna o código mais organizado e modular. Além disso, podemos executar outras tarefas antes de iniciar o servidor, como por exemplo a validação de variáveis de ambiente e a configuração de bibliotecas e serviços externos.
Para rodar o Sevidor a partir do server.js
, podemos executar o seguinte comando:
node src/server.js
Isso iniciará o servidor na porta que foi definida, neste caso a 3000. Abra um navegador e acesse http://localhost:3000
. Você deve ver a mensagem "Cannot GET /" isso acontece porque não há nenhuma rota definida para a raiz do servidor. Quando o servidor recebe uma solicitação GET para a raiz, ele não sabe como responder porque não há uma rota definida para essa solicitação específica, pois definimos a rota base para as APIs routes.use('/api/v1', routes)
em src/app
e em cada rota em controllers/index.js
definimos um prefixo de rota router.use("/cliente", clienteRouters);
, sendo assim temos a seguinte estrutura de rotas:
- Rota base:
http://localhost:3000/api/v1
definida nas configuraçoes deapp.js
. - Rotas da API: que é composta pela rota base mais o prefixo de rota definido em
src/controllers/index.js
, exemplo:http://localhost:3000/api/v1/clientes
http://localhost:3000/api/v1/clientes
- Rotas com parametros que permitem que o cliente da API forneça informações adicionais para a rota,Exemplo
http://localhost:3000/api/v1/clientes/:id
http://localhost:3000/api/v1/clientes/1
nome-do-projeto/
├── src/
| ├── config/
| │ └── database.js
| ├── controllers
| | └── clientes.js
| | └── enderecos.js
| | └── index.js
| ├── database
| | ├── migrations/
| | | └── data-clientes.js
| | | └── data-enderecos.js
| | └── index.js
| ├── models
| | └── Clientes.js
| | └── Enderecos.js
| | └── ...
| ├── app.js
| ├── server.js
├── node_modules/
| └── ...
├── .sequelizerc
├── package-lock.json
└── package.json