Sigo na série de NodeJS. Pra ver o que já foi postado sobre Node aqui no blog vejam a tag nodejs.

Install NodeJSVamos começar pelo básico: instale o Node. Você quer a versão 0.10, que é a última estável (no Node as versões ímpares são instáveis, ou seja, não instale a 0.11). Se você usa Windows, vá ao site do Node e baixe o instalador que é o típico Next, Next, Finish. Se você usa Linux ou Mac, utilize o NVM (Node Version Manager), que é parecido com o RVM (Ruby Version Manager) e permite instalar várias versões diferentes do Node na mesma máquina e trocar facilmente de versão, e não demanda que você compile o node localmente, o que pode ser bem demorado. Ele já baixa o binário pronto e em alguns segundos o Node está disponível. Pra instalar ele rode “curl https://raw.github.com/creationix/nvm/master/install.sh | sh”. Após instalar o NVM, rode “nvm install v0.10” pra instalar a última versão, e já coloque-o como default assim: “nvm alias default 0.10”. Se tiver problemas veja as dependências mínimas exigidas na página do NVM, mas normalmente não é nada complexo.

O básico que você tem que entender de NodeJS é que ele é um engine de JavaScript, o V8, o mesmo que roda no Chrome, só que em vez de encaixado em um browser, encaixado em um server. E como é um server, ele tem acesso a coisas de servidor, como o sistema de arquivos e à rede. O Node não é somente um servidor HTTP, ele vai mais longe, ele é um servidor TCP, e por isso também pode ser um servidor HTTP. Só que nada do que é feito no Node precisa focar no seu lado servidor. Toda a parte de rede está encapsulada em um módulo e você só usa se quiser. E por ser um servidor TCP você pode também usar ele pra coisas bem diferentes de um server http, como um proxy, websockets, VoIP, etc.

O NodeJS usa um sistema de modularização pra organizar os arquivos JavaScript e fugir da bagunça que normalmente impera com desenvolvimento focado em JS. Há dois modelos de modularização de JS que pegaram hoje: o AMD e CommonJS (há ainda o UMD, mas ainda é uma tentativa). O Node usa o CommonJS. No CommonJS você usa o método “require” para solicitar um módulo, o NodeJS lê o arquivo que você indicou, e te entrega o que o módulo expõe, que pode ser qualquer construção do JavaScript, como undefined, um objeto, uma função, uma função construtora, uma string, um número, etc… Uma vez lido, o módulo não é lido novamente. Mas depois eu volto a falar de módulos. Apenas entenda o tal do método “require”. Então, para trabalhar com o módulo http, você faz assim:

var http = require(“http”);

E já pode usar o objeto http retornado.

O Node também expõe alguns objetos nativos dele. Um que você vai usar muito é o “console”. O objeto console permite que você escreva no terminal, o que te ajuda a depurar, a logar coisas, etc. Por exemplo, pra escrever hello world na tela, você faz um arquivo JavaScript com esse código:

console.log(“hello world”);

Se o arquivo se chamar hello.js, você roda ele assim:

node hello

Não precisa colocar “hello.js”, o node entende que o arquivo terá uma extensão .js e encontra ele.

Como o Node utiliza o V8, é natural que o ambiente de execução seja o mesmo. Por esse motivo, o Node tem também uma restrição presente no JavaScript que roda no Chrome: uma única thread. Não há multithreading no NodeJS. Mas calma, isso não é um problema. Tudo no Node é feito de maneira que impeça o bloqueio da thread (quase tudo, mas eu falo disso depois). Por esse motivo, o Node é extremamente leve e rápido. Você não consegue bloquear o servidor. Toda operação que vai demorar vai receber um callback (ou vai retornar uma promessa, mas eu também falo disso depois). Assim, se eu for fazer um bolo ele for demorar, você provavelmente vai chamar o método de fazer bolo assim:

fazerBolo(“chocolate”, function() { 
  console.log(“bolo pronto!”); 
});

Ao rodar a linha acima, a função retorna de imediato. A função anônima passada como segundo parâmetro será chamada posteriormente quando o bolo terminar, na mesma thread, mas em outra stack. Ela é o callback. Esse padrão é muito comum no Node (e na web como um todo), ele está em todo lugar. E ele é muito bom pra manter o servidor leve, mas pode ser um problema se você não souber usar. Isso também é coisa pra outro post.

Pra finalizar eu vou te mostrar como botar pra rodar um servidor http que você pode ver rodando no navegador. É bem simples, nós basicamente requeremos o objeto http, criamos um servidor e abrimos a conexão. Em apenas 4 linhas, fica assim:

var http = require('http');
http.createServer(function(req, res) {
  res.end("hello do node");
}).listen(1234);
console.log("ouvindo em http://localhost:1234");

Chame esse arquivo de server.js e rode ele com “node server”. Abra o navegador em http://localhost:1234 e verá a mensagem “hello do node”.

Note o callback no método createServer. Ele é chamado toda vez que você acessa o servidor. Se você acessar qualquer url na porta 1234 verá a mesma mensagem. Isso pode ser modificado se você inspecionar o objeto de request, que é passado como parâmetro. Pra entender o objeto, por enquanto, faça um console.log(req), ou procure na documentação do Node, que é bem completa. Tente fazer um resposta diferente para a url http://localhost:1234/lambda3. Não é difícil.

Pra ver o exemplo acima funcionando e ainda ver o código rodando no Azure, em 3 minutos e meio, veja o vídeo abaixo:

NodeJS no Windows Azure publicando com Git

A série continua em breve. Até o próximo.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.