Pro Node - Js para
Pro Node - Js para
Pro Node - Js para
Ihrig
!" © # $
&
'
(
)
'
*
"
)
'
,,
)
- )
. /
) 0'
"13
0&,
5
&,
6
7
,
$&
8
9
:
;
&
89
6
<
5*
)
' &
,
)
)
)
) ,
)
=13 ))
)
)
"
)
)
>
=
'
&@
)
13
"13A,
)
1
))
/
)
*)
$
!"#$%
@
<
B $&
C#
'")
) *+,-.
/*/-0
12)3425642
716811265,,,19:
716811265,;3,
Colin Ihrig tem feito experimentos com o JavaScript por prazer e por dinheiro
por mais de 15 anos. Atualmente, ele é engenheiro em tempo integral com o Node.
js, bem como escritor e evangelista do JavaScript, nas horas vagas. Colin recebeu
seu bacharelado em Engenharia e mestrado em Engenharia da Computação da
Universidade de Pittsburgh, em 2005 e 2008, respectivamente. Colin pode ser
alcançado através de sua página web pessoal, em http://www.cjihrig.com.
Sobre o Revisor Técnico
Andy Olsen é consultor/treinador freelance residente no Reino Unido, e tem
trabalhado em sistemas distribuídos há 20 anos. Andy começou a trabalhar em C, em
meados da década de 1980, mas pode muito bem ter sido em meados da década de
1880, pois parece há muito tempo. Andy migrou para o C++, para o Java, e para o
.NET conforme os tempos e as modas mudavam, e é atualmente mantido ocupado
(demais?) em sistemas baseados na web, tanto do lado cliente quanto do lado servidor.
Andy mora no litoral de Swansea e curte correr, cafeterias e observar os cisnes.
Agradecimentos
Eu gostaria de agradecer a todos os que ajudaram a tornar este livro possível.
Agradecimentos especiais a Mark Powers e Ewan Buckingham, da equipe editorial da
Apress. Também gostaria de agradecer ao revisor técnico, Andy Olsen, por seu valioso
feedback. É claro que muitos agradecimentos vão para meus amigos e minha família.
Introdução
Desde sua criação, em 2009, o Node.js evoluiu até a poderosa e crescentemente
popular estrutura de desenvolvimento assíncrono, usada para a criação de aplicativos
JavaScript altamente escalonáveis. Empresas respeitadas como a Dow Jones, a
LinkedIn e a Walmart estão entre as muitas organizações que têm visto o potencial
do Node e o tem adotado em seus negócios.
Depois que tiver dominado essas habilidades, você vai receber conhecimentos
mais avançados de engenharia de software, que vão dar ao seu código um nível
profissional. Você vai aprender a criar facilmente módulos de código reutilizáveis, a
depurar e testar seus aplicativos rápida e eficientemente e a escalonar seu código desde
um único segmento até a nuvem, conforme aumente a demanda pelo seu aplicativo.
Sumário
Capítulo 1
Começando ..........................................................................................1
O Modelo de Execução do Node ...................................................................... 2
O Laço Ler-Avaliar-Imprimir.............................................................................. 6
Funcionalidades do REPL ......................................................................................7
Comandos do REPL...............................................................................................7
Resumo ......................................................................................................... 10
Capítulo 2
O Sistema de Módulos de Node ........................................................11
Instalando Pacotes......................................................................................... 11
Instalando de URLs ..............................................................................................13
Localizações de Pacotes .........................................................................................14
Pacotes Globais.....................................................................................................14
Ligando Pacotes ....................................................................................................15
Removendo Ligações de Pacotes ...........................................................................15
Atualizando Pacotes ..............................................................................................16
Desinstalando Pacotes...........................................................................................16
Resumo ......................................................................................................... 33
Capítulo 3
O Modelo de Programação do Node .................................................35
Programação Assíncrona................................................................................ 36
O Inferno da Rechamada......................................................................................37
Tratamento de Exceções................................................................................. 39
Domínios ............................................................................................................41
Conexão Explícita ................................................................................................42
O módulo async............................................................................................. 44
Executando em Série ............................................................................................44
Tratando Erros......................................................................................................47
Execução em Paralelo............................................................................................48
Limitando o Paralelismo .......................................................................................49
O Modelo Cascata ................................................................................................50
Sumário JXIII
Resumo ......................................................................................................... 54
Capítulo 4
Eventos e Temporizadores .................................................................55
Emissores de Eventos ........................................................................55
Escutando Eventos ...............................................................................................56
Escutadores de Eventos de Instante .......................................................................57
Inspecionando Escutadores de Eventos .................................................................57
O evento newListener ...........................................................................................59
Removendo Tratadores de Eventos ........................................................................60
Detectando Potenciais Vazamentos de Memória ...................................................61
Herdando de Emissores de Eventos.......................................................................61
Usando Eventos para Evitar o Inferno da Rechamada ...........................................63
Temporizadores e Agendamento.................................................................... 65
Intervalos..............................................................................................................65
Os Métodos ref() e unref() ....................................................................................66
Imediatas ..............................................................................................................66
Dividindo Tarefas de Execução Demorada ............................................................67
Agendamento com process.nextTick() ..................................................................68
Implementando Funções Assíncronas de Rechamada ............................................69
Mantendo Comportamento Consistente ..............................................................70
Resumo ......................................................................................................... 72
Capítulo 5
A Interface de Linha de Comandos ...................................................73
Argumentos de Linha de Comandos .............................................................. 73
Processando Valores de Argumentos .....................................................................74
Argumentos de Linha de Comandos no Commander ...........................................76
Ajuda Gerada Automaticamente ...........................................................................77
XIV JPro Node.js para Desenvolvedores
Os Fluxos Padrões.......................................................................................... 78
A Entrada Padrão .................................................................................................78
A Saída Padrão .....................................................................................................82
Outras Funções de Impressão ...............................................................................85
O Erro Padrão ......................................................................................................88
A Interface TTY ...................................................................................................90
Determinando o Tamanho do Terminal ................................................................91
Eventos de Sinais ..................................................................................................92
Variáveis Ambientais do Usuário...........................................................................93
Resumo ......................................................................................................... 94
Capítulo 6
O sistema de arquivos .......................................................................95
Caminhos Relevantes..................................................................................... 95
O Diretório Atual de Trabalho..............................................................................96
Mudando o Diretório Atual de Trabalho...............................................................96
Localizando o Executável Node .....................................................................................97
Capítulo 7
Fluxos ..............................................................................................117
Que são Fluxos?........................................................................................... 117
Capítulo 8
Dados binários.................................................................................135
Visão Geral de Dados Binários ..................................................................... 135
Terminação.........................................................................................................137
Determinando a Terminação ..............................................................................138
A Especificação de Matriz Tipificada...................................................................138
Arraybuffers ........................................................................................................139
Vistas de a ....................................................................................142
Observação Sobre Dimensionamento de Vistas...................................................145
Informação do Construtor ..................................................................................145
Criando uma Vista Vazia ....................................................................................146
Criando uma Vista a Partir de Valores de Dados .................................................146
Criando uma Vista a Partir de Outra ..................................................................146
Propriedades das Vistas .......................................................................................147
Os Buffers de Node ............................................................................................150
O Construtor de ...................................................................................151
Métodos de Transformação em String .................................................................152
Escrevendo Dados Numéricos ............................................................................155
Lendo Dados Numéricos ....................................................................................156
Compatibilidade com Matrizes Tipificadas .........................................................158
Capítulo 9
Executando código ..........................................................................161
O módulo
.................................................................................161
.................................................................................................................161
........................................................................................................163
...............................................................................................................165
A Opção stdio .................................................................................................166
A Classe
.......................................................................... 167
O Evento error ...................................................................................... 168
O Evento exit ........................................................................................ 168
O Evento
...................................................................................... 169
A Propriedade pid.................................................................................... 169
! ....................................................................................................... 169
fork() ....................................................................................................... 170
....................................................................................................... 171
........................................................................................... 173
Sumário JXVII
Capítulo 10
Programação para Redes .................................................................181
Soquetes ..................................................................................................... 181
Capítulo 11
HTTP ................................................................................................205
Um Servidor Básico...................................................................................... 205
Capítulo 12
A estrutura Express..........................................................................233
Rotas do Express ......................................................................................... 233
Parâmetros de Rota .............................................................................................235
Capítulo 13
A Web em Tempo Real .....................................................................253
A API de WebSockets ................................................................................... 254
Abrindo um WebSocket .....................................................................................254
Fechando WebSockets ........................................................................................255
Verificando o Estado de um WebSocket..............................................................256
O evento ...................................................................................................257
O evento
* ............................................................................................257
O evento
.................................................................................................258
O evento error.................................................................................................258
Enviando Dados .................................................................................................259
Capítulo 14
Bases de dados ................................................................................267
Bases de Dados Relacionais ......................................................................... 267
Capítulo 15
Registrando, Depurando e Testando ...............................................287
Registrando ................................................................................................. 287
O Módulo
..........................................................................................288
Transportes .........................................................................................................289
Criando Novos Registradores..............................................................................291
Testando...................................................................................................... 296
O Módulo assert ............................................................................................296
O Método throws()........................................................................................298
O Método
%$ ...........................................................................299
O Método ifError() ......................................................................................300
A Estrutura de Testes Mocha ..............................................................................300
Rodando o Mocha ..............................................................................................300
Criando Testes ....................................................................................................301
Criando Suítes de Testes .....................................................................................301
Testando Código Assíncrono ..............................................................................302
Definindo uma Falha ..........................................................................................302
Ganchos de Testes...............................................................................................303
Desativando Testes..............................................................................................305
Rodando uma única Suíte de Testes ....................................................................305
Resumo ....................................................................................................... 306
Sumário JXXI
Capítulo 16
Escalonamento de aplicativos .........................................................307
O Módulo
..........................................................................................308
O Método fork() ............................................................................................309
Mudando o Comportamento Omissivo de fork() ...........................................310
O Método
............................................................................311
O Objeto workers ..........................................................................................313
A Classe ! ..............................................................................................314
Apêndice A
A Notação de Objeto JavaScript ......................................................325
Tipos de Dados Suportados ......................................................................... 325
Números ...........................................................................................................326
Strings ................................................................................................................326
Booleanos ...........................................................................................................327
Matrizes..............................................................................................................327
Objetos...............................................................................................................327
null.....................................................................................................................328
Tipos de Dados não Suportados .........................................................................328
Índice ...............................................................................................335
CAPÍTULO 1
Começando
O JavaScript foi chamado, inicialmente, de Mocha, quando foi desenvolvido na
Netscape, em 1995, por Brendan Eich. Em setembro de 1995, liberações beta do
Netscape Navigator 2.0 saíram com o Mocha, que foi rebatizado como LiveScript.
Por volta de dezembro de 1995, o LiveScript, depois de ser novamente rebatizado,
tornou-se o JavaScript, seu nome atual. Ainda por esse tempo, a Netscape estava
trabalhando com a Sun, a empresa responsável pela criação da linguagem de
programação Java. A escolha do nome JavaScript causou muita especulação. Muitas
pessoas pensaram que a Netscape estava tentando pegar carona no nome Java, uma
palavra quente, na época. Infelizmente, a escolha do nome causou muita confusão, já
que muitos supuseram que as duas linguagens estavam de alguma forma relacionadas.
Na realidade, elas tinham muito pouco em comum.
&'
'7.
.8.
::.
..
; 6.
::..*..
7.."..
Instalando o Node
O primeiro passo para começar com o Node é a instalação. Esta seção vai ajudar
você a aprontar o Node em sua máquina Ubuntu, OS X ou Windows. A maneira
mais simples de instalar o Node é através do botão Install (instalar) na página base do
Node, <::=
&*, mostrada na figura 1-1. Isso vai baixar os binários ou
o instalador apropriado para seu sistema operacional.
Você também pode navegar pelos binários, instaladores e pelo código fonte de
todas as plataformas em <::=
&*:. Usuários do Windows
muito provavelmente vão querer baixar o Windows Installer (arquivo &
),
enquanto os usuários do Mac devem optar pelo Mac OS X Installer (arquivo &!*).
Usuários do Linux e do SunOS podem baixar binários, mas provavelmente é mais
simples usar um gerenciador de pacotes.
Se o comando ,,
falhar, instale o pacote
,
,
usando o comando mostrado na listagem 1-3.
.!.
.
No Windows, você precisa instalar o Visual C++ e o Python 2.7 para construir
o Node. O Visual C++ pode ser baixado gratuitamente da Microsoft com o Visual
Studio Express. O Python também está disponível de graça, em &&*:.
Para compilar o Node, emita o comando mostrado na listagem 1-6.
Uma última nota a respeito da instalação: é provável que você precise instalar
o Python e um compilador C++ em sua máquina, mesmo que não tenha instalado
o Node a partir do fonte. Fazer isso assegura que módulos nativos escritos em C++
podem ser compilados e executados com sua instalação do Node. No Windows, isso
envolve a instalação do compilador Visual C++ da Microsoft (veja a seção anterior,
“Construindo a partir do fonte”). Para qualquer outro sistema operacional, a base da
construção deve incluir o compilador necessário.
6 JPro Node.js para Desenvolvedores
O Laço Ler-Avaliar-Imprimir
O Node oferece um shell interativo, conhecido como laço Ler-Avaliar-Imprimir,
ou REPL (da sigla em inglês, Read-Eval-Print-Loop). O REPL lê entrada do usuário,
avalia essa entrada como código JavaScript, imprime o resultado e depois espera por
mais entradas. O REPL é útil para depuração e para experimentação de pequenos
fragmentos de código JavaScript. Para iniciar o REPL, inicie o Node sem nenhum
argumento de linha de comando. Daí, você vê o prompt de comandos do REPL, o
caractere >. A partir do prompt, comece a entrar código JavaScript arbitrário.
A listagem 1-9 mostra como iniciar o REPL e entrar código. Neste exemplo,
uma variável chamada foo é criada com o valor string “+G7.H”. Na terceira
linha o REPL imprime “”, porque a sentença de declaração da variável
não retorna nenhum valor. Em seguida, a sentença 6 faz com que o valor de foo
seja inspecionado. Como era de se esperar, o REPL retorna a string “+G7.H”.
Por fim, o valor de foo é impresso no terminal usando-se a função
&
* . Depois de foo ser impresso, o REPL exibe novamente “”, porque
&* não retorna nenhum valor.
Funcionalidades do REPL
O REPL tem uma série de funcionalidades que aumenta a usabilidade, das quais a
mais útil é a capacidade de se navegar pelos comandos previamente emitidos, usando-
se as teclas de setas para cima e para baixo. Para finalizar qualquer comando e voltar
ao prompt em branco, digite ?. Pressionar ? duas vezes a partir
de uma linha em branco faz com que o REPL seja encerrado. Você pode sair do
REPL a qualquer momento, pressionando ?O. Você pode usar a tecla $
para ver uma lista de possíveis completamentos para o comando atual. Se só houver
uma opção possível, o Node a insere automaticamente. A lista inclui palavras-chave,
funções e variáveis. Por exemplo, a listagem 1-11 mostra as opções de completamento
quando um t é introduzido no prompt.
O REPL também oferece uma variável especial, (sublinha), que sempre contém
o resultado da última expressão. A listagem 1-12 mostra vários exemplos de uso de
. Primeiro, uma matriz de strings é criada, fazendo com que referencie a matriz.
O método pop() é então usado para remover o último elemento da matriz baz. Por
fim, o comprimento de baz é acessado, fazendo com que se torne D.
Comandos do REPL
.help
O comando & exibe todos os comandos disponíveis no REPL. A listagem
1-13 mostra a saída da execução do comando &.
&
.R
..&!.
&.1...
&...
.
&.2.-......1 2.
.
&
"."..".
..
.1 2.
....
.exit
O comando & termina o REPL. Este comando é equivalente ao
pressionamento de ?O.
.break
O comando &!, usado para abortar uma expressão multilinhas, é útil se você
cometer um erro ou simplesmente optar por não completar a expressão. A listagem
1-14 mostra um exemplo de uso do comando &! para terminar um laço for
antes de completá-lo. Note que o prompt normal > é mostrado após o comando
&!.
@.."../.A6..K.BA6.?? .8.
&&&.&!.
>
.save nome_do_arquivo
O comando &
" salva a sessão atual do REPL no arquivo especificado em
'". Se o arquivo não existir, ele é criado. Se ele existir, ele é
sobreposto. Os comandos do REPL e as saídas não são salvos. A listagem 1-15 mostra
um exemplo de uso do comando &
". Nesse exemplo, a sessão atual é salva no
arquivo ,
&=
. O conteúdo resultante de ,
&=
é mostrado na
listagem 1-16. Note que o arquivo não contém o prompt do REPL, nem saídas, nem
o comando &
".
@.&
".,
&=
.
.
".<,
&=
.
.load nome_do_arquivo
O comando & executa o arquivo JavaScript especificado em
'". O arquivo é executado como se cada linha fosse digitada diretamente no
REPL. A listagem 1-17 mostra a saída do carregamento do arquivo ,
&=
da listagem 1-16.
.clear
Similar a &!, &
pode ser usado para encerrar expressões multilinhas.
&
também é usado para reiniciar o objeto de contexto do REPL. Neste
momento, você não precisa entender os detalhes, mas a listagem 1-18 mostra um
programa Node que incorpora um REPL. Em outras palavras, ao rodar esse programa,
invoca-se, na verdade, uma instância do REPL. Além disso, você pode definir um
ambiente de execução personalizado para o REPL. Nesse caso, o REPL incorporado
tem uma variável definida, foo, que guarda a string “+G7.1 2”. Chamar &
de dentro do REPL incorporado reseta o contexto e exclui foo.
&
8; &
&./.0+G7.1 256.
10 JPro Node.js para Desenvolvedores
Copie o código da listagem 1-19 para um novo arquivo e salve-o como ola.js. Em
seguida, abra uma janela de terminal e execute-o (veja a listagem 1-20). Note que o
Node não exige que você especifique a extensão .js. Se o arquivo de entrada não for
encontrado e nenhuma extensão for fornecida, o Node tenta adicionar as extensões .js,
.json, e .node. O Node interpreta arquivos .js como código fonte JavaScript e arquivos
com extensão .json como arquivos de Notação de Objeto JavaScript (JSON, na sigla
em inglês). Arquivos com extensão .node são tratados como módulos complementares
compilados.
J Nota O JSON é um texto plano padrão para intercâmbio de dados. Este livro
considera que o leitor está familiarizado com o JSON. No entanto, se você precisar de
uma introdução ou de uma revisão, o JSON é abordado no apêndice A.
Resumo
Parabéns! Você deu os primeiros passos em direção ao desenvolvimento de
aplicativos Node. Esse capítulo ofereceu uma introdução de alto nível do Node, e
guiou você pelo processo de instalação. Você até escreveu algum código Node usando
o REPL. O resto deste livro se ergue sobre esse capítulo, cobrindo os aspectos mais
importantes do desenvolvimento em Node. O Node é melhor conhecido pela criação
de servidores web escalonáveis. Então, é claro que essa funcionalidade é abordada.
Porém, você também vai aprender muito mais, incluindo a programação para sistema
de arquivos, o fluxo de dados, o escalonamento de aplicativos e o sistema de módulos
do Node.