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:
- 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.
Este artigo tem mais de um ano
Parabens pelo ótimo artigo! Que venham mais como estes 😀
+1
+1
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.
bem visto!
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 }}}}.
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.
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 🙂
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.
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…
“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.
+1
Aproveito para questionar se alguém sabe onde se possa ter formação (presencial) em node.js, angular, etc. obg
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.
” em menos de 1 minuto”, se sigo este artigo demorarei como mínimo 10 ou 15 minutos…
Tas muito lento marco 😉 podes fazer copy/paste do código 😉
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.
Então mas não iam ensinar a instalar no Ubuntu?
Já tens aqui: https://pplware.sapo.pt/tutoriais/node-js-aprenda-a-instalar/
Uso node.js diariamente e adoro, mas também adoro a simplicidade do python:
$python -m SimpleHTTPServer 8000
Done.
🙂
+1
os exemplos são sempre iguais não mostram outra coisa
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
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”.
Não consegui acesso ao site para baixar a aplicação e o template. Fora do ar?
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.