Olá pessoal. Tudo certo?!
Hoje, começo uma nova série aqui no blog. Vamos falar sobre node.js.
Minha proposta é começar “devagar” e ir aumentando a complexidade dos posts e exemplos na medida em que a série for avançando.
O que é node.js?
Node.js é um ambiente de execução e um conjunto de bibliotecas open-source.
Ele permite que executemos código em Javascript, fora do browser. Para isso, utiliza o , desenvolvido pela Google e responsável pela execução de scripts no Chrome. Indo além, node.js provê um conjunto de “modules” que aceleram o desenvolvimento de aplicativos.
Como obter?
Node.js funciona em diversos sistemas operacionais, incluindo Windows. Para obter a instalação, acesse: http://nodejs.org/#download
A instalação para Windows é bem pequena (~2.8 Mb). Sua execução é fácil e bastante intuitiva (estilo “Next-Next-Finish”)
Primeira execução
Node.js possui um console REPL, que pode acionado na linha de comando digitando “node”. Observe:
Como indicado no screenshot, você pode digitar instruções Javascript e ver o resultado da execução imediatamente.
Para encerrar a execução do REPL, basta pressionar Control+C duas vezes.
Hello World em Node.js
Podemos escrever programas completos em Javascript e utilizar o Node.js para realizar sua execução.
Observe o exemplo que segue:
var http = require("http"), onRequest = function (request, response) { console.log("Request received."); response.writeHead(200, { "Content-Type": "text/plain" }); response.write("Hello World"); response.end(); }; http.createServer(onRequest).listen(666); console.log("node.js server has started");
Recomendo que você “cole” esse código e salve em um arquivo chamado “simple_server.js”.
O que fizemos? Escrevemos um “pequeno” servidor HTTP. Para executar, no prompt de comando, digite “node simple_server.js” (lembre-se de fazer do diretório onde salvou o arquivo o diretório atual)
O resultado deve ser semelhante ao indicado:
Agora, você pode se “comunicar” com esse server, no browser, acessando o endereço http://localhost:666.
Outra alternativa é usar o Fiddler.
Repare que a cada “acesso” ao endereço. Temos uma alteração no console do server.
Entendendo o código do nosso “Hello world”
Vamos dar uma “dissecada” no código que acabamos de escrever. Para começar, a importação do módulo http.
var http = require("http"),
Esta linha requisita o módulo “http” que é distribuído junto com o node.js. Depois, escrevo um “handler” para requests http. Esta função está conforme a especificação do node.js.
onRequest = function (request, response) { console.log("Request received."); response.writeHead(200, { "Content-Type": "text/plain" }); response.write("Hello World"); response.end(); };
A função recebe dois parâmetros. O primeiro, request, possui informações sobre o “request” que está sendo processado. O segundo, response , é nossa interface para responder para o cliente.
Usamos console.log para escrever algo na saída padrão do sistema operacional. É essa linha que imprime uma mensagem para cada request que é processado.
Depois, usamos os métodos writeHead e write do objeto response para compor a resposta.
Por fim, criamos, efetivamente, nosso server informando nossa função handler e a porta que desejamos “escutar”.
http.createServer(onRequest).listen(666); console.log("node.js server has started");
E isso é tudo.
Um exemplo um pouco mais estruturado
O exemplo anterior é bacana. Mas, está todo em um arquivo. Aplicativos maiores podem ficar difíceis de manutenir dessa forma. A solução está em particionar nosso código em módulos.
Comecemos separando o “starter” da aplicação e o nosso server. Observe (arquivo server.js):
var http = require("http"), url = require("url"); function start() { var onRequest = function (request, response) { var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); response.writeHead(200, { "Content-Type": "text/plain" }); response.write("Hello World"); response.end(); }; http.createServer(onRequest).listen(666); console.log("node.js server has started"); } exports.start = start;
O que fizemos?
- carregamos um outro module do node.js: url. Esse module facilita o trabalho com urls (dahn!)
- colocamos nossa “inicialização” dentro de uma função chamada start;
- atribuímos essa função como valor de uma propriedade em um objeto chamado exports.
Agora, vamos escrever o nosso “starter”. Observe (arquivo index.js):
var server = require("./server"); server.start();
Como pode perceber, carrego o “módulo” através do nome do arquivo (sem extensão). Depois, basta chamar a função usando o nome da propriedade definida no objeto exports.
Veja o console após um request no IE.
Perceba o request do recurso e do favicon.ico.
Para esse primeiro post, era isso.
Fabrício Sanchez
30/11/2011
Esta thread quero acompanhar. Muito bom como sempre!
Lemol-C
02/12/2011
Sempre tratando de temas interessantes. Estou contigo nessa nova serie. Força aí!