recursos. Na prática, com o Node.js você desenvolve uma "aplicação middleware, ou seja, além de programar as funcionalidades da sua aplicação, você também programa
códigos de configuração de infraestrutura da sua aplicação. Inicialmente isso parece
ser muito trabalhoso, pois o Node.js utiliza o mínimo de configurações para servir
2.2. Como funciona um servidor http?
Casa do Código
uma aplicação, mas esse trabalho permite que você customize ao máximo o seu ser-
vidor. Uma vantagem disso é poder configurar em detalhes o sistema, permitindo
desenvolver algo performático e controlado pelo programador.
Caso performance não seja prioridade no desenvolvimento do seu sistema, reco-
mendo que utilize alguns módulos adicionais que já vêm com o mínimo necessário
de configurações prontas para você não perder tempo trabalhando com isso. Alguns
módulos conhecidos são: Connect (https://github.com/senchalabs/connect) , Ex-
press (http://expressjs.com) , Geddy (http://geddyjs.org) , CompoundJS (http:
//compoundjs.com) , Sails (http://balderdashy.github.io/sails) . Esses módulos já são preparados para trabalhar desde uma infraestrutura mínima até uma mais enxuta, permitindo trabalhar desde arquiteturas RESTFul, padrão MVC (Model-View-
Controller) e também com conexões real-time utilizando WebSockets.
Primeiro usaremos apenas o módulo nativo HTTP, pois precisamos entender
todo o conceito desse módulo, visto que todos os frameworks citados acima o uti-
lizam como estrutura inicial em seus projetos. Abaixo mostro a vocês uma clássica
aplicação Hello World. Crie o arquivo hello_server.js com o seguinte con-
teúdo:
var http = require('http');
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type": "text/html"});
response.write("<h1>Hello World!</h1>");
response.end();
});
server.listen(3000);
Esse é um exemplo clássico e simples de um servidor node.js. Ele está sendo exe-
cutado na porta 3000, por padrão ele responde através da rota raiz / um resultado em formato html com a mensagem: Hello World!.
Vá para a linha de comando e rode node hello_server.js. Faça o teste
acessando, no seu navegador, o endereço http://localhost:3000 .
2.2
Como funciona um servidor http?
Um servidor node.js utiliza o mecanismo Event loop, sendo responsável por lidar
com a emissão de eventos. Na prática, a função http.createServer() é respon-
sável por levantar um servidor e o seu callback function(request, response)
14
Casa do Código
Capítulo 2. Desenvolvendo aplicações web
apenas é executado quando o servidor recebe uma requisição. Para isso, o Event loop
constantemente verifica se o servidor foi requisitado e, quando ele recebe uma re-
quisição, ele emite um evento para que seja executado o seu callback.
O Node.js trabalha muito com chamadas assíncronas que respondem através
callbacks do javascript. Por exemplo, se quisermos notificar que o servidor está de
pé, mudamos a linha server.listen para receber em parâmetro uma função que
faz esse aviso:
server.listen(3000, function(){
console.log('Servidor Hello World rodando!');
});
O método listen também é assíncrono e você só saberá que o servidor está de
pé quando o Node invocar sua função de callback.
Se você ainda está começando com JavaScript, pode estranhar um pouco ficar
passando como parâmetro uma function por todos os lados, mas isso é algo muito
comum no mundo Javascript. Como sintaxe alternativa, caso o seu código fique
muito complicado em encadeamentos de diversos blocos, podemos isolá-lo em fun-
ções com nomes mais significativos, por exemplo:
var http = require('http');
var atendeRequisicao = function(request, response) {
response.writeHead(200, {"Content-Type": "text/html"});
response.write("<h1>Hello World!</h1>");
response.end();
}
var server = http.createServer(atendeRequisicao);
var servidorLigou = function() {
console.log('Servidor Hello World rodando!');
}
server.listen(3000, servidorLigou);
2.3
Trabalhando com diversas rotas
Até agora respondemos apenas o endereço /, mas queremos possibilitar que nosso
servidor também responda a outros endereços. Utilizando um palavreado comum
entre desenvolvedores rails, queremos adicionar novas rotas.
15
2.3. Trabalhando com diversas rotas
Casa do Código
Vamos adicionar duas novas rotas, uma rota /bemvindo para página de Bem-
vindo ao Node.js! e uma rota genérica, que leva para uma página de erro. Fare-
mos isso através de um simples encadeamento de condições, em um novo arquivo:
hello_server3.js:
var http = require('http');
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type": "text/html"});
if(request.url == "/"){
response.write("<h1>Página principal</h1>");
}else if(request.url == "/bemvindo"){
response.write("<h1>Bem-vindo :)</h1>");
}else{
response.write("<h1>Página não encontrada :(</h1>");
}
response.end();
});
server.listen(3000, function(){
console.log('Servidor rodando!');