NODE.JS - Construção de Aplicações Web (eBook)

Page 1


NODE.JS CONSTRUÇÃO DE APLICAÇÕES WEB

Luís Abreu

FCA – Editora de Informática, Lda www.fca.pt


EDIÇÃO FCA – Editora de Informática, Lda. www.fca.pt Copyright © 2016, FCA – Editora de Informática, Lda. ISBN eBook: 978-972-722-836-2 1.ª edição eBook: abril 2016 Capa: José Manuel Ferrão – Look-Ahead Todos os nossos livros passam por um rigoroso controlo de qualidade, no entanto aconselhamos a consulta periódica do nosso site (www.fca.pt) para fazer o download de eventuais correções. Não nos responsabilizamos por desatualizações das hiperligações presentes nesta obra, que foram verificadas à data de publicação da mesma. Os nomes comerciais referenciados neste livro têm patente registada. Reservados todos os direitos. Esta publicação não pode ser reproduzida, nem transmitida, no todo ou em parte, por qualquer processo eletrónico, mecânico, fotocópia, digitalização, gravação, sistema de armazenamento e disponibilização de informação, sítio Web, blogue ou outros, sem prévia autorização escrita da Editora.


ÍNDICE GERAL O AUTOR DEDICATÓRIA AGRADECIMENTOS 0. SOBRE O LIVRO 0.1. O que posso encontrar neste livro? 0.2. Requisitos 0.3. A quem se dirige este livro? 0.4. Convenções 0.5. Organização do livro 0.5.1. Capítulo 1: Introdução 0.5.2. Capítulo 2: Express 0.5.3. Capítulo 3: Motores de Templates 0.5.4. Capítulo 4: Utilitários 0.5.5. Capítulo 5: Bases de Dados 0.5.6. Capítulo 6: SPA 0.5.7. Capítulo 7: Autenticação 0.5.8. Capítulo 8: Considerações Finais 0.6. Suporte 1. INTRODUÇÃO 1.1. Porquê o Node.js? 1.2. Instalação 1.3. REPL (Read-Eval-Print-Loop) 1.4. A primeira aplicação 1.5. O primeiro servidor 1.6. Introdução aos módulos 1.6.1. Módulos core 1.6.2. Módulos pasta


1.6.3. Pasta especial node_modules 1.6.4. Objeto module 1.7. Utilitário npm (Node Package Manager) 1.7.1. Atualização do utilitário npm 1.7.2. Instalação de pacotes 1.7.2.1. Instalação global de pacotes 1.7.3. Atualização de pacotes 1.7.4. Desinstalação de pacotes 1.7.5. Publicação de pacotes Conclusão Bibliografia 2. EXPRESS 2.1. Aplicação 2.2. Criação do projeto inicial 2.3. Módulo Express 2.3.1. Roteamento 2.3.1.1. String de rota 2.3.1.2. Funções de rota 2.3.1.3. Método route 2.3.1.4. Objeto Router 2.3.1.5. Definição de várias rotas 2.3.2. Middleware 2.3.3. Motores de templates 2.3.4. Considerações finais 2.4. Homepage 2.4.1. Recuperação inicial dos dados Conclusão Bibliografia 3. MOTORES DE TEMPLATES 3.1. Introdução 3.2. Jade


3.2.1. 3.2.2. 3.2.3. 3.2.4.

Atributos Elementos Texto Código 3.2.4.1. Condições 3.2.4.2. Iterações 3.2.5. Interpolação de strings 3.2.5.1. Interpolação de tags 3.2.6. Mixins 3.2.7. Heranças de templates 3.2.7.1. Definição da personalização 3.2.7.2. Importação de templates 3.3. Vash 3.4. Vista de contactos 3.4.1. Acesso a recursos estáticos Conclusão Bibliografia 4. UTILITÁRIOS 4.1. Utilização de livrarias cliente 4.2. Bower 4.2.1. Outras opções disponíveis 4.2.2. Configuração 4.3. Aplicação contactos: adição do Bootstrap 4.4. Grunt 4.5. Utilização do Bootstrap Conclusão Bibliografia 5. BASES DE DADOS 5.1. Base de dados relacional vs. NoSQL 5.2. SQL Server 5.2.1. Utilização de promises


5.3. MongoDB 5.4. Aplicação contactos: inicialização da base de dados 5.5. Aplicação contactos: adição de nova entrada 5.5.1. Middleware body-parser 5.5.2. Middleware connect-flash Conclusão Bibliografia 6. APLICAÇÕES SPA 6.1. Introdução 6.2. Criação de uma API HTTP 6.2.1. Carregamento de contacto 6.2.2. Adição de novos contactos 6.2.3. Eliminação de contactos existentes 6.3. Consumo da API HTTP 6.3.1. Criação do controlador AngularJS 6.3.2. Criação de rota para apresentação da página 6.3.3. Alteração da regra de criação do ficheiro de script 6.3.4. Definição da página HTML de contactos 6.3.5. Detalhes finais 6.4. Melhorias possíveis Conclusão Bibliografia 7. AUTENTICAÇÃO 7.1. Introdução 7.2. Autenticação, autorização e módulo Passport 7.3. Gestão de utilizadores 7.4. Operações relacionadas com palavras-chave 7.5. Registo de utilizadores 7.6. Utilização de Passport 7.6.1. Configuração da estratégia local 7.6.2. Criação da página de login


7.6.3. Alteração do menu 7.6.4. Final de sessão autenticada 7.6.5. Autorização de rotas Conclusão Bibliografia 8. CONSIDERAÇÕES FINAIS 8.1. Introdução 8.2. Timers 8.3. Eventos 8.4. HTTP 8.4.1. Servidores 8.4.1.1. Objeto ServerRequest 8.4.1.2. Objeto ServerResponse 8.4.2. Clientes 8.4.2.1. Upload de dados 8.5. URL 8.6. Query string 8.7. Streams 8.8. File System (fs) 8.9. Buffer 8.10.Crypto 8.10.1.Hashing 8.10.2.HMAC 8.11.Process 8.12.Web Sockets Conclusão Bibliografia ÍNDICE REMISSIVO COMPLEMENTOS NA WEB


O AUTOR Luís Abreu – Licenciado em Engenharia de Sistemas e Computadores pela Universidade da Madeira. Utilizador regular da plataforma .NET desde 2002. Ao longo dos últimos anos, participou em vários projetos Web e contribuiu com vários artigos para o site do grupo português PontoNetPT. Atualmente, trabalha na SRA, onde é um dos responsáveis pela arquitetura e desenvolvimento de aplicações. É MVP ASP.NET desde outubro de 2005. A partir de 2006, passou a ser o único português a integrar o grupo internacional ASP Insiders (um grupo de elite que mantém contactos regulares com a equipa da Microsoft que desenvolve a plataforma ASP.NET). Autor dos seguintes livros editados pela FCA: ASP.NET 4.5, AJAX com ASP.NET, Silverlight 4.0 e Desenvolvimento em Windows 8, da coleção Curso Completo; HTML5 (4.a Ed. At. e Aum.), ASP.NET MVC, JavaScript (2.a Ed. At.), LINQ com C# (coautor), ASP.NET 4.5.1 e JavaScript 6, da coleção MyTI.


Este livro ĂŠ dedicado Ă minha esposa, Marina.


AGRADECIMENTOS Em primeiro lugar, quero agradecer à minha esposa, Marina, pelo apoio fornecido durante todo o processo de escrita do livro. Não posso deixar de referir a participação do Helder Robinson: as suas revisões, contribuições técnicas e opinião sincera tiveram uma influência positiva no resultado final. Finalmente, queria também agradecer à Ana Correia e à Laura Faia, da FCA, pela disponibilidade demonstrada ao longo do projeto. Luís Abreu


0

SOBRE O LIVRO

Nos últimos anos, o Node.js (ou simplesmente Node, como é conhecido por muitos dos seus fãs) tem ganhado cada vez mais popularidade e peso na comunidade de programação. Esta plataforma dirigida por eventos I/O (Input/Output) recorre ao motor de JavaScript V8 para permitir a escrita de aplicações em JavaScript. Os princípios sobre os quais assenta (acessos I/O assíncronos, suporte predefinido para os protocolos mais importantes e utilização de streams) foram fundamentais para garantir a sua crescente utilização no desenvolvimento de aplicações e utilitários.

0.1

O QUE POSSO ENCONTRAR NESTE LIVRO?

Neste livro, são apresentadas as principais caraterísticas e funcionalidades disponibilizadas pela plataforma Node.js. Para além da apresentação dessas caraterísticas base mais importantes, introduzimos ainda alguns dos pacotes Node.js que disponibilizam os módulos e ferramentas mais usados na construção de aplicações Web nesta plataforma. Ao longo dos capítulos seguintes, estes módulos são utilizados na criação de uma aplicação Web simples, cujo principal objetivo é ilustrar a aplicação prática de todos os princípios apresentados ao longo do livro. Assim, no final deste livro, o leitor terá à sua disposição uma aplicação Web que recorre a uma base de dados NoSQL para efetuar o armazenamento da informação necessária ao seu funcionamento.


A aplicação mostra ainda como podemos gerar páginas tradicionais através de uma arquitetura MVC, onde um controlador é responsável por obter os dados que são renderizados por um motor de vistas. Finalmente, temos ainda código que ilustra a criação de serviços de dados que são consumidos por código cliente (por outras palavras, ilustramos ainda uma possível forma de criarmos SPA – Single Page Applications – a partir desta plataforma).

0.2

REQUISITOS

Apesar de ser um livro prático, a verdade é que ele foi escrito para permitir que a aprendizagem das funcionalidades da plataforma possa ser feita sem que o leitor tenha de estar sentado em frente de um computador. Todos os exemplos apresentados no livro podem ser obtidos a partir do site da editora (http://www.fca.pt). A criação de aplicações para Node.js obriga-nos apenas a instalar a plataforma (download gratuito a partir de https://nodejs.org/en/download/). A instalação da plataforma introduz também o gestor de pacotes do Node.js, que, como veremos, é usado para instalarmos os pacotes com os módulos que serão utilizados ao longo do livro. Para além disso, a instalação encarrega-se ainda de efetuar todas as alterações necessárias à configuração do sistema para garantir a utilização dos comandos necessários a partir de qualquer pasta do sistema. Apesar de ser possível recorrermos a um editor de texto para escrever o código usado nos exemplos que acompanham este livro, a verdade é que a produtividade será maior se utilizarmos um dos vários IDE (Integrated Development Environments) existentes. O leitor proveniente do mundo .NET pode, por exemplo, recorrer ao Node.js Tools for Visual Studio (pode ser obtido a partir de https://www.visualstudio.com/features/ node-js-vs.aspx e utilizado em conjunto com a versão Community do Visual Studio – esta versão é gratuita e pode ser obtida a partir de


https://www.visualstudio.com/post-downloadvs?sku=community&clcid=0x409). Neste livro, optámos por criar os exemplos através do editor WebStorm da Jetbrains. Este editor não é gratuito, mas disponibiliza uma versão para testes que pode ser utilizada durante 30 dias (https://www.jetbrains.com/webstorm). Apesar de representar um investimento, este é um bom editor para quem necessita de escrever código JavaScript no dia a dia. Note-se ainda que este editor não está limitado apenas à escrita de código Node.js, podendo mesmo ser usado na escrita de código usado no lado cliente (por exemplo, JQuery, AngularJS, CSS). Para além da plataforma Node.js, o leitor que queira testar o código do livro necessita ainda de instalar outras aplicações. Por exemplo, no Capítulo 5, apresentamos código que mostra como podemos interagir com bases de dados relacionais e base de dados NoSQL a partir de aplicações Node.js. Sempre que seja preciso instalar aplicações ou componentes extra, o leitor poderá obter todas as informações necessárias à instalação no capítulo onde essa aplicação é utilizada.

0.3

A QUEM SE DIRIGE ESTE LIVRO?

Este livro é dirigido a todos aqueles que pretendem colocar-se rapidamente a par das principais funcionalidades introduzidas pela plataforma Node.js e pelos principais módulos utilizados na construção de aplicações Web. O livro parte do pressuposto de que o leitor já tem alguns conhecimentos e experiência na escrita de código JavaScript, pelo que não são apresentadas quaisquer noções básicas ou de introdução à linguagem. Se o leitor está interessado em aprender JavaScript ou estar ao corrente das novidades introduzidas pelo JavaScript 6, então recomendamos a leitura dos livros JavaScript e JavaScript 6, ambos publicados pela FCA.


0.4

CONVENÇÕES

Ao longo deste livro, optou-se por seguir um conjunto de convenções que facilitam a interpretação do texto e do código apresentados. Assim, todos os excertos de código são apresentados no formato seguinte: let a = 10;

Por sua vez, as notas ou observações importantes poderão ser encontradas no interior de uma secção semelhante à seguinte: Nota importante Esta é uma nota ou observação importante.

0.5

ORGANIZAÇÃO DO LIVRO

Este livro encontra-se dividido em oito capítulos, que podem ser lidos sequencialmente ou, se o leitor assim o preferir, alternadamente (isto é, sem respeitar a ordem de capítulos apresentada). A leitura sequencial do livro conduz o leitor ao longo do processo de construção da aplicação Web que acompanha este livro. Por outro lado, a leitura não sequencial dos capítulos permite o uso do livro como referência para funcionalidades. Esta aproximação é possível devido ao facto de todas as (poucas) dependências entre capítulos estarem devidamente identificadas.

0.5.1

CAPÍTULO 1: INTRODUÇÃO

Este capítulo inicia o nosso estudo da plataforma Node.js. Depois de justificar o porquê do uso desta plataforma, o capítulo documenta a sua instalação e efetua uma introdução rápida ao seu ambiente de runtime. O capítulo apresenta ainda o conceito de módulo e mostra como podemos


utilizar os pacotes publicados no registo central através do uso do gestor de pacotes do Node.js (NPM).

0.5.2

CAPÍTULO 2: EXPRESS

Neste capítulo, começamos por definir os principais objetivos da aplicação que acompanha este livro para, em seguida, apresentarmos detalhadamente o módulo Express. Com a utilização deste módulo, passamos a poder definir rotas e componentes de middleware, duas abstrações que serão muito importantes na simplificação do código e que nos permitem utilizar uma aproximação baseada na arquitetura MVC (Model-View-Controller) na aplicação Web que acompanha o livro.

0.5.3

CAPÍTULO 3: MOTORES DE TEMPLATES

Neste capítulo, introduzimos o conceito de motores de templates e apresentamos as principais caraterísticas associadas à utilização de dois dos motores de templates mais utilizados quando optamos pelo uso da biblioteca Express: estamos a falar dos motores Jade e Vash. Depois de apresentar as principais caraterísticas de cada um desses motores, o capítulo recorre ao motor Jade para criar a primeira vista utilizada pela aplicação que acompanha o livro.

0.5.4

CAPÍTULO 4: UTILITÁRIOS

Neste capítulo, apresentamos os utilitários Bower e Grunt. O Bower desempenha um papel semelhante ao NPM, mas concentra-se na gestão de pacotes de bibliotecas cliente. Por sua vez, com o Grunt podemos recorrer a JavaScript para efetuar a automatização de tarefas. Como veremos, a combinação destas duas ferramentas permitir-nos-á melhorar o aspeto da nossa aplicação através da adição do Bootstrap (com o Bower


adicionamos referências às livrarias cliente e usamos o Grunt para automatizar as tarefas de publicação dos componentes necessários).

0.5.5

CAPÍTULO 5: BASES DE DADOS

A utilização de bases de dados é uma necessidade comum a praticamente todas as aplicações Web. Neste capítulo, começamos por efetuar uma pequena comparação entre bases de dados relacionais e bases de dados NoSQL. Em seguida, apresentamos exemplos da interação com base de dados de ambos os tipos. O capítulo encerra com a apresentação de várias alterações efetuadas na aplicação que acompanha o livro e que permitem guardar os dados usados pela aplicação numa base de dados MongoDB.

0.5.6

CAPÍTULO 6: SPA

Nos dias que correm, é cada vez mais usual termos aplicações Web ricas, que recorrem ao servidor apenas para obterem os dados necessários ao seu funcionamento. Estas aplicações são conhecidas como SPA (Single-Page Applications) e são o foco deste capítulo. Como veremos, a criação de serviços que se limitam a devolver dados em formato JSON (JavaScript Object Notation) é muito simples em Node.js. O consumo destes dados a partir do cliente não depende da plataforma em si, mas esta ajuda-nos a gerir corretamente as dependências para as livrarias cliente necessárias.

0.5.7

CAPÍTULO 7: AUTENTICAÇÃO

A autenticação e autorização são dois conceitos transversais à maior parte das aplicações Web. Depois de introduzirmos ambos os conceitos, apresentamos algumas das funcionalidades disponibilizadas pelo módulo Passport. Este módulo é compatível com a pipeline introduzida pela biblioteca Express e permite-nos autenticar um utilizador de acordo


com uma de várias estratégias predefinidas. Neste capítulo, ilustramos o código necessário à autenticação baseada no armazenamento local de credenciais e apresentamos o código necessário à verificação de autorização na consulta e modificação dos contactos geridos pela aplicação.

0.5.8

CAPÍTULO 8: CONSIDERAÇÕES FINAIS

Neste capítulo, apresentamos algumas das principais caraterísticas dos módulos core introduzidos automaticamente pelo Node.js. Eventos, tratamentos de pedidos HTTP, utilização de streams ou criptografia são tópicos abordados ao longo deste capítulo. O capítulo encerra com a apresentação do módulo Socket.io. Apesar de este módulo não fazer parte dos módulos predefinidos expostos pela plataforma, a realidade é que o seu uso permite-nos o estabelecimento de um canal de comunicação bidirecional em tempo real entre cliente e servidor numa aplicação Web (esta é uma funcionalidade que, com toda a certeza, será cada vez mais utilizada nas aplicações Web).

0.6

SUPORTE

Este livro foi feito com base na versão 5.0.0 da plataforma Node.js. Se, por acaso, o leitor encontrar informação que lhe pareça incorreta, ou tiver sugestões em relação ao conteúdo de alguma secção do livro, então não hesite e envie um email com as suas questões para labreu@gmail.com. Eventuais alterações e uma errata serão publicadas no site da editora em http://www.fca.pt.


1

INTRODUÇÃO

De acordo com o site (https://nodejs.org/en), o Node.js é um ambiente de runtime de JavaScript baseado no motor de JavaScript V8 (este é o motor de JavaScript usado pelo browser Chrome). Do ponto de vista arquitetural, o Node.js carateriza-se por utilizar um modelo direcionado a eventos, onde as operações de I/O são efetuadas de forma assíncrona para evitar bloqueios desnecessários. Atualmente, o seu ecossistema de pacotes disponibiliza o maior número de bibliotecas open source existentes no mundo, que podem ser utilizadas em qualquer aplicação através do uso do utilitário npm (Node.js Package Manager).

1.1

PORQUÊ O NODE.JS?

O Node.js significa coisas diferentes para pessoas diferentes. Contudo, a maioria das pessoas concorda com o facto de podermos classificá-lo como uma plataforma que permite a execução de JavaScript fora do browser. Como referimos, o Node.js recorre ao motor de runtime JavaScript V8, motor este que é usado internamente pelo browser Chrome (desenvolvido pela Google). O Node.js não se limita apenas a utilizar este excelente motor de runtime, que recorre algumas das técnicas mais avançadas existentes na área dos compiladores. Em vez disso, a plataforma aproveitou ainda para efetuar algumas otimizações que são muito úteis quando pensamos na execução de JavaScript fora do browser. Por exemplo, a manipulação de dados binários é uma das operações que beneficiou desta interação entre a plataforma e o motor V8 (foi a pensar neste tipo de


operações que o Node.js introduziu a classe Buffer, que é apresentada no Capítulo 8). Internamente, a arquitetura do Node.js recorre ao chamado ciclo de eventos (event loop) para permitir a fácil criação de aplicações seguras e escaláveis. Como é óbvio, cada arquitetura tem vantagens e desvantagens. No caso desta plataforma, os seus criadores optaram por uma arquitetura que reduz a complexidade inerente à criação de aplicações, sem que isso implique uma penalização ao nível da sua performance. Esta aproximação baseada no uso de um ciclo de eventos é suportada por um conjunto de bibliotecas que permitem a realização de operações de I/O de forma assíncrona. Por outras palavras, o acesso a um ficheiro ou a execução de uma consulta sobre uma base de dados não resulta num bloqueio do sistema. Em vez disso, o Node.js prefere notificar a aplicação quando esses dados estiverem disponíveis através da geração de um evento. Este comportamento predefinido contrasta com o disponibilizado por outras plataformas mais maduras, como, por exemplo, o ASP.NET MVC (a realização de operações assíncronas é suportada, mas não é a abordagem predefinida). O ciclo de eventos em Node.js O Node.js recorre a um ciclo de eventos (event loop) para sinalizar a ocorrência de determinados acontecimentos importantes. O leitor com experiência na escrita de código JavaScript usado em páginas HTML notará algumas semelhanças entre este modelo e o usado pelos browsers. Por exemplo, suponhamos que temos uma página HTML com um botão cujo evento click foi associado a uma determinada função. Um clique sobre um botão resulta na adição de um evento à pilha de eventos controlada pelo tab do browser que apresenta a página. Este evento acaba por conduzir à execução da função que tinha sido previamente associada ao evento click desse botão. Estes princípios são reutilizados pelo Node.js no tratamento de operações I/O. Todos os acontecimentos importantes resultam na geração de um evento em Node.js. Por exemplo, a leitura de um ficheiro é, por predefinição, uma operação assíncrona. Quando iniciamos um processo de leitura,


temos sempre de fornecer uma função de callback que será responsável por interpretar o conteúdo desse ficheiro. Esta função de callback será apenas invocada quando o Node.js gerar um evento que sinaliza o final do carregamento dos conteúdos desse ficheiro. Na prática, podemos ver o ciclo de eventos como sendo uma fila do tipo FIFO (First in, first out), em que cada elemento contém uma sequência de instruções (tipicamente definidas no interior de uma função) que devem ser executadas pela aplicação. Sempre que ocorre um novo evento, é adicionada uma nova entrada ao final dessa fila. A próxima operação a executar pela aplicação é sempre a operação que está no início dessa fila. Nesta altura, importa reter que todo o código JavaScript escrito para Node.js é executado numa única thread, pelo que é fácil concluirmos que devemos ter algum cuidado no código colocado no interior das funções que tratam os eventos gerados pela plataforma. Se estivermos perante cálculos intensivos no interior de uma função desse tipo (isto é, se estivermos perante código que necessita de vários ciclos de CPU (Central Processing Unit) para realizar uma determinada operação), então um servidor Node.js será incapaz de tratar mais pedidos enquanto esses cálculos estiverem a ser efetuados. Este comportamento predefinido do Node.js foi muito criticado por várias pessoas. Contudo, a alternativa que é seguida por muitas outras plataformas também introduz vários problemas. Por exemplo, a utilização de várias threads pode contribuir para aumentar o throughput de uma aplicação, mas também implica a necessidade de utilização de mecanismos adicionais de coordenação. Estes mecanismos nem sempre são lineares e, como já foi comprovado várias vezes no passado, contribuem muitas vezes para degradar a performance de uma aplicação. Portanto, o Node.js optou por uma aproximação pragmática baseada no uso de uma única thread, em que toda a interação com I/O é feita assincronamente, sendo a conclusão das operações sinalizada através da geração de eventos que, por sua vez, também são adicionados ao final da fila de eventos. Esta aposta na realização de operações assíncronas é boa, uma vez que estamos perante operações que demoram algum tempo a concluir e não dependem diretamente do processador. Nesta altura, o leitor poderá estar a interrogar-se acerca de como deverá proceder quando estiver perante cenários de computação intensiva. Nesses casos, os cálculos devem ser efetuados noutra thread através do uso de Web Workers – o leitor interessado pode obter mais informações no livro JavaScript, também publicado


pela FCA (http://www.fca.pt/pt/catalogo/informatica/tecnologias-programacaoweb/javascript/). Importa ainda salientar que todas as observações efetuadas nesta nota são feitas a partir do ângulo do programador Node.js. Como é óbvio, os detalhes de implementação (que se encontram totalmente abstraídos no core da plataforma) até podem recorrer a várias threads para garantirem a realização assíncrona das operações I/O, mas a verdade é que esses detalhes nunca transpiram para o programador que está a criar uma aplicação Node.js. Um programador Node.js sabe apenas que todo o código é executado numa única thread e que essa thread não deve referenciar funções com cálculos intensivos.

Nos dias que correm, em que a explosão da Web fez com que o JavaScript se tornasse na linguagem da moda e as aplicações são cada vez mais complexas, a possibilidade de reutilização dos conceitos, recomendações e código entre lado cliente e servidor é uma mais-valia a que os programadores não ficarão, com toda a certeza, alheios. E esta é mais uma área onde o Node.js brilha. Se é verdade que existem outras opções para a escrita de JavaScript no lado servidor, também é verdade que nenhuma dessas plataformas possui caraterísticas semelhantes às disponibilizadas pelo Node.js: para além da facilidade que carateriza a escrita de aplicações em Node.js, dificilmente encontraremos outra plataforma que disponibilize uma tão grande variedade de módulos e plugins que podem ser consumidos gratuitamente por parte das nossas aplicações.

1.2

INSTALAÇÃO

Atualmente, o Node.js corre em Windows, Linux, Mac e outros sistemas POSIX (Portable Operating System Interface – por exemplo, Solaris ou BSD). A forma mais fácil de o instalar passa por efetuarmos o download do pacote adequado a partir do site https://nodejs.org/en/download/ (Figura 1.1).


FIGURA 1.1 – Obtenção do pacote de instalação a partir do site do Node.js

Alternativamente, o leitor interessado pode obter todo o código fonte do projeto a partir do repositório existente em https://github.com/ nodejs/node. Neste caso, o leitor terá acesso a todas as funcionalidades disponibilizadas pela versão mais recente da plataforma (algumas delas poderão estar ainda sujeitas a bugs), mas também será responsável pela compilação do projeto (o que pode não ser uma tarefa muito simples). Neste caso, e uma vez que a máquina usada na escrita do livro recorre ao sistema operativo Windows da Microsoft, vamos utilizar o instalador para Windows. Depois de darmos início ao processo de instalação e de aceitarmos a licença proposta, temos de indicar a pasta onde queremos instalar o Node.js (Figura 1.2).


FIGURA 1.2 – Definição da pasta onde o Node.js é instalado

Em seguida, temos acesso a uma janela que nos permite escolher os componentes que devem ser instalados. Por predefinição, e como é possível verificar através da Figura 1.3, o instalador procede à execução de todas as opções disponíveis (neste caso, vamos aceitar estas escolhas e clicar no botão Next).


FIGURA 1.3 – Opções disponibilizadas pelo instalador do Node.js

A partir desta altura, o instalador dá início à cópia dos ficheiros e à execução dos restantes passos selecionados na Figura 1.3. Se tudo correr como esperado, então temos o Node.js instalado e podemos dar início à escrita de código sobre esta plataforma.

1.3

REPL (READ-EVAL-PRINT-LOOP)

Como referimos anteriormente, o Node.js não é mais do que um ambiente de runtime de JavaScript, que disponibiliza um conjunto de bibliotecas e módulos predefinidos que simplificam a criação de aplicações. Apesar de a maior parte deste livro se debruçar sobre o uso desta


plataforma na construção de aplicações Web, a verdade é que o Node.js pode ser utilizado apenas como ambiente de runtime de JavaScript. Uma boa forma de analisarmos algumas das potencialidades disponibilizadas pelo ambiente de runtime desta plataforma passa pelo uso do chamado Node REPL (Read-Eval-Print-Loop). Para iniciarmos o Node REPL, temos apenas de executar o utilitário node.exe (sem qualquer parâmetro) a partir da linha de comandos, conforme ilustrado na Figura 1.4.

FIGURA 1.4 – Utilização do Node REPL

A execução do utilitário node.exe é possível a partir de qualquer local desde que tenhamos mantido a opção Add to PATH selecionada durante a execução do instalador (Figura 1.3). Note-se como o cursor muda (>) a partir da altura em que entramos no Node REPL. A partir desta altura, podemos escrever instruções JavaScript e verificar o resultado da execução de cada uma dessas instruções. Para ilustrarmos algumas das funcionalidades disponibilizadas pelo REPL, vamos começar por criar uma função designada por dizOla, que é responsável por


imprimir um nome que lhe é passada através de um parâmetro. Depois de definida, podemos invocar a função através do uso do operador (). A Figura 1.5 mostra o aspeto do REPL depois de executarmos estas instruções.

FIGURA 1.5 – Avaliação de instruções no Node REPL [nota: no Windows 10, sistema usado neste livro, é repetida a primeira instrução da consola da PowerShell]

O REPL permite-nos escrever qualquer expressão ou instrução JavaScript e obter rapidamente feedback sobre a sua execução. Contudo, para tirarmos total partido deste ambiente, convém sabermos que existe um conjunto de metacomandos que são responsáveis por efetuar algumas operações úteis. Atualmente, todos os metacomandos iniciam-se com o caráter . (ponto final). O metacomando .help apresenta um menu com os restantes metacomandos disponibilizados pelo sistema: > .help break

Sometimes you get stuck, this gets you out

clear

Alias for .break


exit

Exit the repl

help

Show repl options

load

Load JS from a file into the REPL session

save Save all evaluated commands in this REPL session to a file

O metacomando .clear será, com toda a certeza, um dos mais importantes, já que permite limpar o contexto atual fazendo, assim, com que eventuais variáveis e closures existentes sejam removidas da memória sem que tenhamos de reiniciar o REPL. Quando introduzimos o nome de uma variável, o REPL procede à sua apresentação. Note-se que o REPL é suficientemente inteligente para enumerar as propriedades de objetos complexos (como é possível verificar através da Figura 1.5, a exceção a esta regra é a apresentação de funções – e isto deve-se apenas ao facto de as funções serem, tipicamente, definidas à custa de várias linhas, o que acaba por resultar na impressão de várias linhas na consola). Para ilustrar este ponto, vamos criar um objeto com algumas propriedades no REPL e proceder à sua enumeração (Figura 1.6). Como é possível observar através da Figura 1.6, o REPL encarrega-se de apresentar todas as propriedades do objeto, formatadas de modo a simplificar a sua leitura.


FIGURA 1.6 – Avaliação de uma variável que referencia um objeto complexo no Node REPL [nota: no Windows 10, sistema usado neste livro, é repetida a primeira instrução da consola da PowerShell]

1.4

A PRIMEIRA APLICAÇÃO

Opcionalmente, podemos indicar o nome de um ficheiro de JavaScript quando executamos o utilitário node.exe. Nesses casos, a plataforma limita-se a executar o JavaScript definido no interior desse ficheiro. Para ilustrarmos este ponto, vamos começar por criar um ficheiro designado por teste.js (cap01/ex1/teste.js), com as instruções seguintes: "use strict"; function dizOla(nome){ console.log(nome); } dizOla("luis");


Depois de ativarmos o modo strict, que desativa algumas funcionalidades JavaScript associadas a más práticas (o leitor interessado pode obter mais detalhes sobre este modo no livro JavaScript, também publicado pela FCA), definimos uma função que imprime um nome através da instrução console.log. Em seguida, essa função é invocada com a string luis. Agora que já temos um ficheiro com JavaScript válido, vamos executar o seguinte comando a partir do interior da pasta que contém o ficheiro: node teste.js

Como é possível verificar através da Figura 1.7, neste caso, o utilitário limita-se a executar todo o código mantido no ficheiro de JavaScript (em vez de iniciar o REPL).

FIGURA 1.7 – Execução de um ficheiro através do utilitário node.exe


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.