Pplware

Node.js: Aprenda a criar um servidor web em menos de 1 minuto

O Node.js é um interpretador de código JavaScript que funciona do lado do servidor. Esta plataforma permite aos programadores o desenvolvimento de aplicações em rede, em tempo real e de alta escalabilidade, de uma forma simples e rápida. O Node.js é baseado no interpretador V8 da Google.

Hoje vamos aprender a instalar o Node.js no Ubuntu e aprender a criar as primeiras apps.

Como referido, uma das razões que está a tornar o node.js cada vez mais popular é a utilização do javascript como linguagem de programação. Antes do node.js, o javascript era apenas utilizado no browser e para programarmos no lado do servidor teríamos que utilizar outra linguagem como o PHP.

Isto obrigava que um programador Web precisasse ter conhecimentos em HTML, CSS, Javascript e uma outra linguagem. O node.js veio mudar isso oferecendo-nos a possibilidade de escrever servidores Web utilizando o javascript e graças ao modelo não bloqueante obter uma boa performance.

Neste pequeno tutorial vamos mostrar como criar um servidor de conteúdo estático, como é o caso de ficheiros HTML ou CSS. Qualquer servidor HTTP conseguiria fazer a mesma tarefa sem termos de recorrer à programação, mas vamos aproveitar para conhecer melhor o node.js.

O node.js está disponível para varias plataformas. Como editor de texto vamos usar o poderoso Sublime Text.

Estrutura do Projecto

A estrutura do projecto será bastante simples, vamos criar uma pasta principal e, dentro dessa pasta, iremos ter a nossa aplicação “server.js” e a pasta “public” onde iremos colocar todo o conteúdo do nosso site, ficheiros HTML, CSS e outros irão para aqui.

|---public\
|
|---server.js

Para não começarmos do zero, procurei um template gratuito que fosse responsivo e com o aspecto pretendido para o nosso site. Um site com design responsivo é um site que se adapta a vários tamanhos de ecrã seja ele Desktop, Tablet ou Smartphone.

O framework mais popular que nos permite fazer isso chama-se bootstrap e foi criado pelo Twitter para facilitar o desenvolvimento de páginas web, dando-lhes um aspecto uniforme. São boas fontes de pesquisa para este tipo de templates os sites startbootstrap ou o shapebootstrap. Depois de encontrado o template, fiz-lhe algumas alterações e copiei todos os ficheiros e pastas para a pasta “public”. Vamos agora começar a desenvolver o servidor no ficheiro “server.js”.

Em vez de reunir todos os componentes directamente no node.js, optou-se por permitir adicionar funcionalidades ao node.js através de módulos e é por aí que vamos começar. Logo no início da aplicação vamos incluir os módulos que iremos utilizar.

var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')

Neste tutorial vou apenas utilizar módulos core ou seja módulos que já vêm incluídos no node.js. Podemos também instalar módulos externos através do node package manager ou npm.

Este utilitário é instalado juntamente com o node.js e permite-nos instalar milhares de módulos de código aberto e assim adicionar funcionalidades às aplicações que estamos a desenvolver. Pesquisando o repositório em npmjs.com poderíamos com certeza encontrar algum modulo que fornecesse as funcionalidades que pretendemos implementar no servidor mas não é esse o objetivo deste tutorial.

Criação do Servidor Web

A seguir vamos criar o servidor no localhost porta 80 que é a porta utilizada pelo protocolo de transferência HTTP.

http.createServer(function (pedido, resposta) {
   
// Aqui vamos escrever o código do servidor que vai ser
// executado sempre que for feito um pedido

}).listen(80, 'localhost', function () {
  console.log('--- O servidor arrancou –--');
});

Se observarmos o código acima vemos uma coisa que pode parecer estranha, as funções podem ter como parâmetros outras funções, são as chamadas callback functions, perceber o seu mecanismo é essencial para o desenvolvimento em node.js, por isso aconselho o estudo mais aprofundado deste tema. Por exemplo, na linha:

… listen(80, 'localhost', function () { … });

foi definida uma função anónima que vai ser executada após o arranque do servidor.

Para arrancar com o servidor abrimos a linha de comandos, mudamos para a pasta do projecto e escrevemos:

node server.js

O nosso servidor ainda não faz nada, simplesmente mostra no ecrã a informação que o servidor arrancou. Para interromper a execução do servidor digite CTRL+C.

Sempre que for feito um pedido ao servidor temos que:

Quando escrevemos o endereço http://www.exemplo.com/caminho/recurso num browser de internet podemos ver que esse endereço é composto por diversas partes. A parte que nos interessa é o caminho/recurso. Para obtê-lo e vamos escrever o seguinte:

...
// Aqui vamos escrever o código do servidor que vai ser
// executado sempre que for feito um pedido

var caminho = url.parse(pedido.url).pathname;

Porque os ficheiros que pretendemos utilizar estão na pasta public vamos criar uma variável com o caminho completo do ficheiro a ler.

if (caminho==='/') {
 var ficheiro = path.join(__dirname, 'public', caminho, 'index.html');
} else {
 var ficheiro = path.join(__dirname, 'public', caminho);
}

A função path.join é utilizada para juntar as diversas partes do caminho. A variável __dirname é uma variável do node.js que indica a pasta do script atual, à qual juntamos a pasta public e o caminho obtido a partir do url. Quando o endereço que escrevemos no browser não contém o caminho/recurso então o conteúdo a apresentar será a página index.html.

A seguir vamos então ler o ficheiro correspondente ao caminho/recurso que foi pedido ao servidor.

fs.readFile(ficheiro, function (erro, dados) {
if (erro) {
resposta.writeHead(404);
resposta.end();
} else {
resposta.end(dados);
}

Se o ficheiro que foi pedido não existir ou caso ocorra algum erro ao ler o ficheiro devolvemos o código de status 404 e terminamos a resposta do servidor, caso contrário devolvemos o conteúdo do ficheiro. Se não definirmos um código de status ele será sempre 200 ou seja não ocorreram erros.

Testar…

Para testar vamos iniciar novamente o server.js, abrir um browser de internet e digitar o endereço http://127.0.0.1. Podemos ver que o servidor já funciona mas a nossa página de internet parece estar com alguns problemas de formatação.

Para que uma página seja correctamente interpretada pelo browser temos que incluir na resposta do servidor o tipo de conteúdo que estamos a enviar. Podemos fazer isso observando a extensão do nome do ficheiro que estamos a ler, por exemplo, para o ficheiro “índex.html” a extensão é “html” e o tipo de conteúdo será “text/html”.

Para resolver este problema vamos criar um objecto com as extensões dos ficheiros incluídos no template e o seu correspondente tipo de conteúdo. Vamos adicionar este objecto antes da criação do servidor.

var contentTypes = {
  'html' : 'text/html',
  'css'  : 'text/css',
  'ico'  : 'image/x-icon',
  'png'  : 'image/png',
  'svg'  : 'image/svg+xml',
  'js'   : 'application/javascript',
  'otf'  : 'application/x-font-otf',
  'ttf'  : 'application/x-font-ttf',
  'eot'  : 'application/vnd.ms-fontobject',
  'woff' : 'application/x-font-woff',
  'woff2': 'application/font-woff2',
  'zip'  : 'application/zip'
}

Podemos encontrar uma lista com os tipos de conteúdo em http://www.freeformatter.com/mime-types-list.html

Vamos também adicionar antes da resposta do servidor com o conteúdo do ficheiro as linhas abaixo, onde obtemos a extensão do ficheiro e definimos o tipo de conteúdo utilizando o objecto anteriormente criado.

var extensao = path.extname(ficheiro).slice(1);
resposta.setHeader('Content-Type', contentTypes[extensao]);

Com isto fica concluído este tutorial cujo objectivo não era ser perfeito nem definitivo, pretendendo apenas ser um ponto de partida para um maior conhecimento do node.js.

Para publicar o site na internet utilizei a versão gratuita da plataforma Openshift desenvolvida pela Red Hat. O resultado final pode ser visto em http://server-rgapps.rhcloud.com/ onde também existe um link para download do código da aplicação e template.

Exit mobile version