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

26 Comentários

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.

nodejs_12_thumb.jpg

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:

  • 1º Saber qual o ficheiro pedido (pagina html)
  • 2º Ler o ficheiro correspondente a partir da pasta public
  • 3º Responder ao pedido com o conteúdo do ficheiro lido

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.

Comentários

26

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Joao
    Joao

    Parabens pelo ótimo artigo! Que venham mais como estes 😀

  2. Avatar de Zé Montanelas
    Zé Montanelas

    O node.js é porreiro para brincar e fazer uns scriptzinhos, para produção já não é assim tão engraçado…
    É apenas a tendência mais recente como linguagem server-side assim como o Python e Ruby o eram à uns poucos anos

    Eu não gosto de perder a minha vida a reinventar a roda e a fazer tudo raiz, nem tinha tempo pra respirar em certos projectos e bem podem esquecer essa complexidade desnecessária da programação assíncrona e “fix’s” complicaditos que acabam em “callback hell”, para além de ter as suas peculiaridades e depois ninguém sabe mexer naquilo, quanto mais ser proficiente

    O PHP é rei em termos de recursos, CMS’s, frameworks e comunidades, e é absolutamente especializado para a web em termos de funcionalidades, está cada vez melhor e mais rápido na versão 7, a diferença de performance é 1 salto quântico

    Nos benchmarks de 2016 o PHP7 + NGINX bate qualquer outra linguagem web, seja Node.js, Go, Python, perl…

    Na era do DDR4 e SSD, servir paginas, uns pequenos loops e uns acessos de base de dados é relativamente muito pouco exigente.

    1. Avatar de Gonçalo
      Gonçalo

      bem visto!

    2. Avatar de Peter
      Peter

      Sem querer tirar o mérito a este bom artigo…. Node.js é interessante mas a linguagem javascript não é propriamente o ideal para aplicações sérias e manter/atualizar código nesta linguagem é outro pesadelo e daqui a uns meses ou anos se for outro programador a mexer no código que não o criador, então é caos garantido.
      Se o servidor não for para gerir o funcionamento de uma central nuclear, usando python/flask/gevent consegues mais facilmente criar um servidor e com mais meia dúzia de linha ligas a uma base de dados postgres ou mysql e tudo isso com uma linguagem bem mais agradável de usar que javascript {{{{{ exceptando talvez os obcecados por chavetas }}}}.

      1. Avatar de luiz
        luiz

        só estou vendo pessoas sem conhecimento debatendo o tema. nodejs é uma das melhores senão a melhor linguagens para servidor, aceita o dobro de requisições ao banco por segundo, é altamente escalável. é usado em alguns sites como wallmart porque em dias de bleckfreday congestiona os servidores.

    3. Avatar de Andre
      Andre

      Vou só deixar isto aqui

      https://github.com/nodejs/node/wiki/Projects,-Applications,-and-Companies-Using-Node

      O nodejs pode e é utilizado em producao. O Netflix usa node, assim como o Ebay.
      O PHP tem uma comunidade muito grande, tem muitos recursos disponiveis e, sobretudo, muita mao de obra. No entanto, é verdade também que é uma linguagem ultrapassada, nada elegante e a perder terreno todos os anos para outras plataformas mais modernas.
      O facto de nao saber javascript suficiente para evitar o “callback tree of hell” e entender as vantagens da assincronidade nao chega para justificar o seu ponto de vista.

      Gostava de ver também que benchmark chegou a conclusao que o PHP é mais rapido que o Go…

      De lá uma oportunidade ao javascript e ao node. Vai ver que nao se arrepende!

      P.S: Um salto quantico é a menor diferenca que pode ser medida entre dois sistemas. Espero que o salto do PHP5 para o 7 nao tenha sido mesmo quantica 🙂

      1. Avatar de Peter
        Peter

        Já que estamos numa de links , vou também só deixar isto aqui:
        http://geekforbrains.com/post/after-a-year-of-nodejs-in-production
        Além do artigo, os comentários que lá foram deixados também são reveladores, sendo que a maioria dos programadores que efetivamente usam Node.js, após o entusiasmo inicial acabam por voltar a java ou .net para soluções duráveis e fáceis de manter.
        Quem sabe programar C# ou java dificilmente consegue gostar de javascript.

    4. Avatar de David
      David

      A tendência de quem não entende programação assíncrona é de mandar bitaites como esses…
      Javascript é muito mais poderoso que PHP. Até python mete o php a um canto. Não digo que existe um monte de tralha ja feito em PHP. Não quer dizer que seja rei por isso…

    5. Avatar de Manuel
      Manuel

      “Na era do DDR4 e SSD, servir paginas, uns pequenos loops e uns acessos de base de dados é relativamente muito pouco exigente.”

      Isso depende muito do problema, da quantidade de dados e da quantidade de loops. No caso de programação distribuída e base de dados NoSQL as coisas podem mudar de figura. No caso de problemas relacionados com data analytics, um loop e um SQL statement tem muita importância.

  3. Avatar de Gonçalo
    Gonçalo

    Aproveito para questionar se alguém sabe onde se possa ter formação (presencial) em node.js, angular, etc. obg

    1. Avatar de Marco
      Marco

      Se souberes indica-me. Já andei a pesquisar e o mais aproximado que encontrei foi jquery e javascript no citeforma. Tudo o que é node, angular, react, etc… só online. Udemy por exemplo.

  4. Avatar de Marco Sousa
    Marco Sousa

    ” em menos de 1 minuto”, se sigo este artigo demorarei como mínimo 10 ou 15 minutos…

    1. Avatar de Pedro Pinto

      Tas muito lento marco 😉 podes fazer copy/paste do código 😉

      1. Avatar de Marco Sousa
        Marco Sousa

        O artigo diz “Aprenda a criar … em menos de 1 minuto”, copiar/colar não é aprender.

        Repara, “Aprenda o kernel em menos de 1 minuto”, e damos a opção de descarregar o código fonte do kernel.

  5. Avatar de JM
    JM

    Então mas não iam ensinar a instalar no Ubuntu?

  6. Avatar de Pedro Diogo
    Pedro Diogo

    Uso node.js diariamente e adoro, mas também adoro a simplicidade do python:
    $python -m SimpleHTTPServer 8000
    Done.
    🙂

  7. Avatar de Pedro
    Pedro

    os exemplos são sempre iguais não mostram outra coisa

    1. Avatar de Rui Gomes
      Rui Gomes

      o tutorial tinha que ser simples pois o node.js apenas tinha sido abordado muito levemente aqui no Pplware mas estou aberto a sugestões para um próximo tutorial

  8. Avatar de Diego Herinque
    Diego Herinque

    Vejo sempre algum programador/desenvolvedor veterano(claro né!) dizer – “Por que reinventar a roda e tals[…]”. Vi algo assim na internet – “Por que somente quem fez ou faz sabe o [processo] porque dela ser assim”. Concluo afirmando, nem todos que estão iniciando no mundo da programação tem a mínima idéia e/ou não sabem como elaborar [engenharia reversa] tais aplicações. Nas apostilas tem um percurso a percorrer e não dão ao leitor ou aluno etapas de exemplos de como criar um aplicação/software real do zero. Somente ensinam e demonstram por parte o que cada ferramenta ou síntaxe, semântica faz e pronto. Agora, criar [desenvolver], imaginar algo do zero e um passo-a-passo, isso poucos ensinam e somente quem fez sabe como faz e consegue converter pra outras linguagens. Isso é partilhar do conhecimento e apoiar o código fonte aberto. Cito como exemplo a Estação Espacial do Brasil, que anda atrasada por não poder usar tecnologia e apoio estrangeiro, foi vetado pelo Estados Unidos a desculpa dada é que o brasil deve criar seu próprio ônibus espacial com recursos naturais e engenharia própria. Alegando que o Brasil utiliza combustível nuclear que pode ser uma ameaça mundial, sendo que o primeiros deles fora feito a base de um míssil, ora senhores isso não seria reinventar a roda??? E ainda continuo, não também empurrar outras nações a fazerem o mesmo invento com tecnologia própria[reinventar a roda] leia mais em – https://pt.wikipedia.org/wiki/Programa_espacial_brasileiro O que isso tem a ver? Tudo! “Resumo tudo isso na frase – Na vida nada se cria tudo se copia”.

  9. Avatar de José Lopes
    José Lopes

    Não consegui acesso ao site para baixar a aplicação e o template. Fora do ar?

  10. Avatar de Italo Andre
    Italo Andre

    Bom para qualquer projeto necessitamos de performance, volecidade e etc. gostaria de mais indicações sobre onde encontro um ótimo servidor dedicado com Data Center no Brasil e preço acessível.