Carregando...

Criar Servidor HTTP

No ecossistema Node.js, criar um servidor HTTP é uma habilidade essencial para o desenvolvimento de aplicações web e serviços de backend de alto desempenho. Node.js, com sua arquitetura baseada em eventos e modelo non-blocking, permite que milhares de conexões simultâneas sejam gerenciadas eficientemente, tornando-o ideal para servidores escaláveis e APIs em tempo real.
Um servidor HTTP atua como intermediário entre requisições de clientes e respostas do servidor, sendo a base para APIs RESTful, aplicações de página única e microserviços. No desenvolvimento com Node.js, é fundamental compreender conceitos como sintaxe avançada, estruturas de dados, algoritmos otimizados e princípios de programação orientada a objetos, garantindo que o código seja limpo, manutenível e performático.
Neste tutorial, você aprenderá a criar servidores HTTP básicos e avançados, gerenciar requisições e respostas, implementar roteamento de múltiplos caminhos, lidar com erros de forma robusta e otimizar o desempenho do servidor. Além disso, exploraremos práticas recomendadas de segurança, padrões de design e integração com arquiteturas de sistemas complexos, fornecendo uma base sólida para o desenvolvimento de aplicações Node.js profissionais. Ao final, você estará apto a construir servidores HTTP confiáveis e escaláveis seguindo as melhores práticas do Node.js.

Exemplo Básico

text
TEXT Code
const http = require('http');

const PORT = 3000;

const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Bem-vindo ao servidor HTTP Node.js!\n');
});

server.listen(PORT, () => {
console.log(`Servidor rodando em http://localhost:${PORT}`);
});

Neste exemplo básico, utilizamos o módulo interno http do Node.js para criar um servidor simples. A constante PORT define a porta em que o servidor escutará as requisições. A função createServer recebe cada requisição (req) e envia uma resposta (res). O método writeHead define o código de status e os headers, enquanto res.end envia a resposta e encerra a conexão.
Este servidor demonstra a arquitetura orientada a eventos do Node.js, capaz de gerenciar múltiplas requisições simultaneamente sem bloquear o event loop. Garantir que res.end seja chamado é crucial para liberar recursos e evitar memory leaks. Este exemplo serve como base para expandir funcionalidades, como APIs REST, servir conteúdo estático ou integração com banco de dados.

Exemplo Prático

text
TEXT Code
const http = require('http');
const url = require('url');

const PORT = 4000;

const routes = {
'/': (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Página Inicial\n');
},
'/api/data': (req, res) => {
const data = { message: 'Dados da API Node.js' };
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(data));
},
'/about': (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Página Sobre\n');
}
};

const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const routeHandler = routes[parsedUrl.pathname];

if (routeHandler) {
try {
routeHandler(req, res);
} catch (error) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Erro interno do servidor');
console.error('Erro do servidor:', error);
}
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Página não encontrada');
}

});

server.listen(PORT, () => {
console.log(`Servidor prático rodando em http://localhost:${PORT}`);
});

No exemplo prático, utilizamos um objeto routes para mapear caminhos a funções específicas. O url.parse extrai o caminho da requisição, e a função correspondente é executada. O uso de try/catch garante um tratamento seguro de erros. As respostas podem ser em texto simples ou JSON, permitindo aplicações reais com APIs e páginas web.
Ao encapsular a lógica de roteamento em classes ou módulos, mantemos uma estrutura orientada a objetos, melhorando a manutenibilidade do código. O uso correto de writeHead e res.end otimiza recursos e evita memory leaks. Este servidor é facilmente expansível para servir arquivos estáticos, autenticação e integração com bancos de dados.

As melhores práticas em Node.js incluem programação modular, uso eficiente de módulos internos e garantia de finalização de cada requisição com res.end. O gerenciamento adequado de erros, via try/catch ou eventos error, é essencial. Erros comuns incluem esquecer de chamar res.end, ignorar rotas desconhecidas e usar algoritmos ineficientes no processamento de requisições.
Para depuração, recomenda-se console.error e ferramentas de profiling (--inspect). A otimização de desempenho pode envolver caching, compressão e limitação de conexões. A segurança do servidor é reforçada com validação de entradas, prevenção de injeção de código e uso de HTTPS. Seguindo essas práticas, é possível construir servidores HTTP robustos, seguros e escaláveis.

📊 Tabela de Referência

Node.js Element/Concept Description Usage Example
http.createServer Cria um servidor HTTP const server = http.createServer((req,res)=>{res.end('Olá');});
res.writeHead Define status e headers res.writeHead(200, {'Content-Type':'text/plain'});
res.end Envia resposta e finaliza requisição res.end('Olá Mundo');
url.parse Analisa URL para roteamento const parsedUrl = url.parse(req.url,true);
try/catch Tratamento seguro de erros try {routes[path](req,res);} catch(e){res.end('Erro');}

Aprender a criar servidores HTTP em Node.js permite processar requisições de forma não bloqueante, gerenciar objetos Request/Response, implementar múltiplos caminhos e lidar com erros de forma robusta. Essas habilidades são essenciais para construir aplicações web escaláveis, performáticas e de fácil manutenção.
Próximos passos incluem estudar frameworks como Express.js, desenvolver REST APIs, integrar bancos de dados, aplicar caching e otimização de performance. Práticas recomendadas envolvem construção de servidores multifuncionais, testes de carga e monitoramento de logs. Documentação oficial do Node.js e projetos open-source são ótimas fontes para aprendizado contínuo.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

3
Perguntas
🎯
70%
Para Passar
♾️
Tempo
🔄
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo