Prévia do material em texto
Artigo Original: AN ABSOLUTE BEGINNER'S GUIDE TO NODE.JS• Tradução: Eric Douglas• Veja uma versão atualizada desse artigo aqui Não existe uma escassez de tutoriais para Node.js, mas a maioria deles cobrem casos de uso específicos ou tópicos que são aplicáveis só se você já tiver um conhecimento prático do Node. Eu vejo vários comentários que se parecem com coisas do tipo: "Eu fiz o download do node, agora o que fazer?" Este tutorial responde esta questão e explica como iniciar bem do princípio. O que é Node.js? Muitos iniciantes em Node tem a dúvida de o quê exatamente ele é, e a descrição em nodejs.org definitivamente não ajuda. Uma coisa importante de se perceber é que o Node não é um servidor web. Por ele próprio, não se tem nada. Ele não funciona como o Apache. Não existe um arquivo de configuração onde você o aponta para seus arquivos html. Se você quer que o Node seja um servidor HTTP, você tem que escrever um servidor HTTP (com a ajuda das bibliotecas incluídas). O Node.js é somente outra forma de executar código em seu computador. Ele é simplesmente um JavaScript runtime (ambiente de execução de código JavaScript). Instalando o Node.js Guia Para Absolutos Iniciantes em Node.js terça-feira, 12 de julho de 2016 20:32 Página 1 de Indroducao-NodeJS Node.js é muito simples de ser instalado. Se você estiver usando Windows ou Mac, os instaladores estão disponíveis napágina de download. Já tenho o Node instalado, e agora o que fazer? Uma vez instalado, agora você tem acesso a um novo comando chamado node. Você pode usar o comando node de duas formas diferentes. A primeira é sem argumentos. Isto irá abrir um shell interativo (REPL: read-eval-print-loop), onde você pode executar código JavaScript puro. $ node > console.log('Hello World'); Hello World undefined No exemplo acima eu digitei console.log('Hello World') dentro do shell e apertei enter. O Node vai então executar o código e nós podemos ver nossa mensagem registrada. Ele também imprime undefined pelo fato de sempre mostrar o valor de retorno de cada comando, e console.log não retorna nada. A outra forma de rodar o Node é fornecendo a ele um arquivo JavaScript para execução. Isto será na maioria das vezes a maneira como você irá utilizá-lo. hello.js console.log('Hello World'); $ node hello.js Hello World Neste exemplo, eu movi o comando console.log() para dentro de um arquivo e então passei este arquivo para o comando node como um argumento. O Node então roda o JavaScript contido neste arquivo e imprime "Hello World". Fazendo Algo Útil Rodar código JavaScript é divertido e tal, mas não é muito útil. Ai é onde o Node.js também inclui um poderoso conjunto debibliotecas (módulos) para se fazer coisas reais. No primeiro exemplo eu vou abrir um arquivo de registros e analisá-lo. example-log.txt 2013-08-09T13:50:33.166Z A 2 2013-08-09T13:51:33.166Z B 1 2013-08-09T13:52:33.166Z C 6 2013-08-09T13:53:33.166Z B 8 2013-08-09T13:54:33.166Z B 5 O que esses dados registrados significam não importa, mas basicamente cada mensagem contém uma data, uma letra e um valor. Eu quero somar os valores para cada letra. A primeira coisa que nós precisamos fazer é ler o conteúdo do arquivo. my-parser.js // Carregando o módulo fs (filesystem) var fs = require('fs'); // Leia o conteúdo do arquivo para a memória fs.readFile('example-log.txt', function ( err, logData ) { // Se um erro ocorrer, será lançada uma // exceção, e a aplicação irá ser encerrada if ( err ) throw err; // logData é um Buffer, converta-o para string var text = logData.toString(); }); Felizmente o Node.js faz a entrada e saída (I/O) do arquivo facilmente com o módulo embutido filesystem (fs). O módulofs tem uma função chamada readFile que pega o caminho de um arquivo e um callback. O callback vai ser invocado quando o arquivo for lido por completo. O dado do arquivo vem na forma de um Buffer, que é basicamente um array de bytes. Nós podemos convertê-lo para uma string usando a função toString(). Página 2 de Indroducao-NodeJS um array de bytes. Nós podemos convertê-lo para uma string usando a função toString(). Agora vamos adicionar o parsing (analisador). my-parser.js // Carregando o módulo fs (filesystem) var fs = require('fs'); // Leia o conteúdo do arquivo para a memória fs.readFile('example-log.txt', function ( err, logData ) { // Se um erro ocorrer, será lançada uma // exceção, e a aplicação irá ser encerrada if ( err ) throw err; // logData é um Buffer, converta para string var text = logData.toString(); var results = {}; // Quebrando o arquivo em linhas var lines = text.split( '\n' ); lines.forEach(function ( line ) { var parts = line.split( ' ' ); var letter = parts[ 1 ]; var count = parseInt( parts[ 2 ] ); if ( !results[ letter ] ) { results[ letter ] = 0; } results[ letter ] += parseInt( count ); }); console.log( results ); // { A: 2, B: 14, C: 6 } }); Agora vamos passar este arquivo como um argumento para o comando node e ele vai imprimir o resultado e sair. $ node my-parser.js { A: 2, B: 14, C: 6 } Eu uso muito o Node.js para scripts como este. É uma alternativa muito mais simples e poderosa que os scripts bash. Callbacks Assíncronos Como você viu no exemplo anterior, o padrão típico do Node.js é o uso de callbacks assíncronos. Basicamente você está dizendo a ele para fazer algo e quando isso estiver terminado ele irá chamar sua função (callback). Isto porque o Node é dethread única. Enquanto você está esperando pelo disparo do callback, o Node pode fazer outras coisas ao invés de bloquear até que a requisição esteja terminada. Isso é especialmente importante para servidores web. Isto é muito comum em aplicações web modernas para acessar banco de dados. Enquanto você espera pelo retorno do banco de dados, o Node pode processar mais requisições. Isso permite que você manipule milhares de conexões conjuntas com pequenos acréscimos, comparado a criar uma thread separada para cada conexão. Fazendo Algo Útil - Servidor HTTP Como disse anteriormente, o Node não faz nada por si só. Um dos módulos embutidos tornam a criação de servidores HTTPsimples muito fácil, que é o exemplo na página inicial do Node.js. my-web-server.js var http = require('http'); http.createServer(function ( req, res ) { // req = requisição, res = resposta res.writeHead( 200, { 'Content-Type': 'text/plain' } ); res.end( 'Hello World\n' ); }).listen( 8080 ); console.log( 'Servidor rodando na porta 8080' ); Quando eu digo básico, quero dizer básico mesmo. Este não é um servidor HTTP completo. Ele não pode servir qualquer arquivo HTML ou de imagem. De fato, não importa sua requisição, ela vai retornar 'Hello World'. No entanto, você pode rodar isto e verá em seu navegador no endereço http://localhost:8080 o texto "Hello World". $ node my-web-server.js Página 3 de Indroducao-NodeJS $ node my-web-server.js Você pode ter percebido uma coisa diferente agora. Sua aplicação node.js não fechou. Isto acontece pois você criou um servidor e sua aplicação node vai continuar rodando e respondendo as requisições até que você mesmo mate o processo. Se você quiser ter um servidor web completo, você terá que fazer este trabalho. Você deve checar o que foi requisitado, ler os arquivos apropriados e enviar o conteúdo de volta. Pessoas já fizeram este trabalho duro para você. Fazendo Algo Útil - Express Express é um framework que torna a criação de sites normais muito simples. A primeira coisa que você tem que fazer é instalá-lo. Juntamente com o comando node, você também tem acesso a um comando chamado npm. Esta ferramenta permite que você acesse uma enorme coleçãode módulos criados pela comunidade, e um deles é o Express. $ cd /my/app/location $ npm install express Quando você instala um módulo, ele vai ser colado em uma pasta chamada node_modules dentro do diretório da sua aplicação. Você pode agora requisitar (require) este módulo como um módulo embutido. Vamos criar um arquivo estático básico usando o Express. my-static-file-server.js var express = require('express'); app = express(); app.use(express.static(__dirname + '/public')); app.listen(8080); $ node my-static-file-server.js Agora você tem um servidor de arquivos estáticos bastante eficiente. Tudo que você colocar dentro da pasta /public poderá ser requisitado pelo seu navegador e será mostrado. HTML, imagens, enfim, tudo. Por exemplo, se você colocar uma imagem chamada my-image.png dentro da pasta public, você pode acessá-la usando seu navegador no endereçohttp://localhost:8080/my-image.png. Claro que o Express tem vários outros recursos, mas você pode olhá-los a medida que continua desenvolvendo. NPM Nós usamos um pouco o NPM nas seções anteriores, mas eu quero enfatizar o quão importante esta ferramenta se faz no desenvolvimento para Node.js. Existem milhares de módulos disponíveis que resolvem quase todos os problemas típicos que você encontra. Lembre-se de checar o NPM antes de re-inventar a roda. Não é inédito para uma aplicação Node ter dezenas de dependências. No exemplo anterior nós instalamos o Express manualmente. Se você tiver muitas dependências, essa não será uma forma muito interessante de instalá-las. É por isso que o NPM faz uso do arquivo package.json. package.json. { "name" : "MyStaticServer", "version" : "0.0.1", "dependencies" : { "express" : "3.3.x" } } Um arquivo package.json contém um resumo da sua aplicação. Existem vários campos disponíveis, sendo este apenas o mínimo. A seção dependencies (dependências) descreve o nome e a versão dos módulos que você gostaria de instalar. Neste caso eu vou aceitar qualquer versão do Express 3.3. Você pode listar quantas dependências quiser nesta seção. Agora, ao invés de instalar cada dependência em separado, nós podemos rodar um simples comando e instalar Página 4 de Indroducao-NodeJS Agora, ao invés de instalar cada dependência em separado, nós podemos rodar um simples comando e instalar todas elas. $ npm install Quando você roda este comando, o npm vai verificar na pasta atual pelo arquivo package.json. Se ele encontrar um, então irá instalar cada dependência listada. Organização do Código Até agora só usamos um único arquivo, que não é muito sustentável. Na maioria das aplicações, seu código vai ser dividido em vários arquivos. Não existe nenhuma norma ou organização imposta dizendo para onde os arquivos vão. Isto não é Rails. Não há conceitos de views e controllers acontecendo aqui. Você pode fazer o que quiser. Vamos refatorar o script de análise de registros (log parsing). Ele será muito mais testável e manutenível se nós separarmos a lógica de análise (parsing) dentro de um arquivo próprio. parser.js // Construtor Parser var Parser = function () { }; // Analisa o texto especificado Parser.prototype.parse = function ( text ) { var results = {}; // Quebra o arquivo em linhas var lines = text.split('\n'); lines.forEach(function ( line ) { var parts = line.split( ' ' ); var letter = parts[ 1 ]; var count = parseInt( parts[2] ); if ( !results[ letter ] ) { results[ letter ] = 0; } results[ letter ] += parseInt( count ); }); return results; }; // Exportando o construtor Parser neste módulo module.exports = Parser; O que eu fiz foi criar um novo arquivo para conter a lógica da análise dos registros. Isto é apenas JavaScript puro e existe várias formas de se encapsular este código. Eu escolhi por definir um novo objeto JavaScript pois assim é mais fácil de se fazer testes unitários. A parte importante para isso é a linha module.exports. Isso diz ao Node que você está exportando deste arquivo. Neste caso exportei um construtor, então os usuários podem criar instâncias do meu objeto Parser. Você pode exportar qualquer coisa que quiser. Agora vamos ver como importar este arquivo e fazer uso do novo objeto Parser. my-parser.js // Requisitando o arquivo parser.js var Parser = require('./parser'); // Carregandoo módulo fs (filesystem) var fs = require('fs'); // Lendo o conteúdo do arquivo para a memória fs.readFile('example-log.txt', function ( err, logData ) { // Se um erro ocorrer, irá ser lançada // a exceção e a app será encerrada if ( err ) throw err; // logData é um Buffer, converta-o para string var text = logData.toString(); // Criando uma instância do objeto Parser var parser = new Parser(); // Chame a função parse console.log( parser.parse( text ) ); // { A: 2, B: 14, C: 6 } Página 5 de Indroducao-NodeJS // { A: 2, B: 14, C: 6 } }); Arquivos são incluídos da mesma forma que os módulos, exceto que você inclui um caminho ao invés de um nome. A extensão .js é implícita, então você pode omití-la se quiser. Tendo sido exportado um construtor, é isso que vai ser retornado da declaração require. Eu posso agora criar instâncias do meu objeto Parser e usá-las. Resumo Esperamos que este tutorial tenha feito a ponte entre a parte de fazer o download do Node.js e construir sua primeira ferramenta. O Node.js é uma tecnologia extremamenta poderosa e flexível que pode resolver uma vastidão de tipos de problemas. Eu quero que cada um de vocês se lembre que o Node.js é somente limitado pela sua imaginação. As bibliotecas de seu núcleo foram cuidadosamente projetadas para fornecer as peças do quebra-cabeça necessárias para se construir qualquer fotografia. Combine-as com módulos disponíveis no NPM e será incrível o quão rápido você poderá começar a construir aplicações muito complexas e atraent es. De <https://github.com/ericdouglas/traduz-ai/blob/master/nodejs/001-guia-para-iniciantes-absolutos-em-nodejs.md> Página 6 de Indroducao-NodeJS Artigo Original: THE DEAD-SIMPLE STEP-BY-STEP GUIDE FOR FRONT-END DEVELOPERS TO GETTING UP AND RUNNING WITH NODE.JS, EXPRESS, JADE, AND MONGODB • Tradução: Eric Douglas• Configure uma Aplicação Full Stack JavaScript e a tenha funcionando em 30 minutos. Faça- a conversar com seu banco de dados em outros 30. Você pode encontrar/forkar este tutorial e todo o projeto de exemplo no Github. Introdução Existem aproximadamente cem milhões de tutorials na web para obter um "Hello World!" com Node.js. Isto é ótimo! Isto é especialmente bom se seu objetivo é comprimentar o mundo e depois abandonar sua carreira na web e passar o resto da sua vida como um jóquei, ou qualquer outra coisa. Isto realmente não descreve muitos de nós, então vamos olhar por mais tutoriais. Em minha experiência, o "próximo nível" de tutoriais que achamos estão 30 níveis acima destes. Vamos de um "Hello World" para uma construção de um sistema inteiro de blog com comentários. Isto também é ótimo, mas muitas vezes estes tutoriais assumem que o leitor tem um sólido conhecimento básico, e então eles soltam um monte de funções sobre você de uma só vez. Eu aprendo melhor fazendo um monte de etapas intermediárias, menores, e não acho que sou o único. Eu não sou o único, certo? Bom, boa notícia a todos! Eu li e fiz muitos tutoriais, até que as coisas finalmente funcionaram. Tenho um projeto web rodando que usa Node.js, o framework Express, o pré-processador de HTML chamado Jade e o MongoDB para os dados. Sou capaz de ler e escrever a partid do banco de dados. A partir disso, o céu é o limite. Aqui está o acordo: Vou mostrar à você como pegar todas essas coisas e configurá-las. Vouassumir que você é um desenvolvedor front-end que conhece o suficiente de HTML5/CSS3/JavaScript para que eu não tenha que explicá-los. Seu aplicativo vai ficar bonito, vai se conectar com um DB (banco de dados), ele vai obter alguns resultados, e vai fazer coisas com estes resultados. E por diversão também vamos fazê-lo salvar dados no DB. Através de tudo isso, eu irei explicar o que o código faz, e como escrevê-lo, ao invés de somente fornecer a você funções massantes para olhar. Vamos partir de nada instalado, para uma aplicação que manipula banco de dados em uma linguagem que você compreende totalmente, e a fundação necessária para construir funcionalidades adicionais para sua app. E vamos fazer isso aproximadamente em 60 minutos entre instalação e codificação. Isso é impressionante? Sugiro que sim. Vamos lá! PARTE 1 - 15 MINUTOS DE INSTALAÇÃO Se você está realmente começando do zero, então ter tudo rodando leva um pouco de tempo. Nada disso é difícil. Eu rodo o Windows 8 na minha máquina, então isso pode ser um pouco diferente no Mac, Ubuntu ou qualquer outro sistema *nix, mas é basicamente a mesma coisa em todos os casos. PASSO 1 - INSTALANDO NODE.JS Isso é realmente fácil. Vá para o site do Node.js e clique no grande botão verde Install. Ele irá detectar seu sistema Simples Guia Passo-a-Passo Para Desenvolvedores Front- End Iniciarem Com Node.js, Express, Jade e MongoDB terça-feira, 12 de julho de 2016 20:31 Página 7 de Indroducao-NodeJS Abra o prompt de comando• cd até o diretório em que você deseja manter suas aplicações de teste• Isso é realmente fácil. Vá para o site do Node.js e clique no grande botão verde Install. Ele irá detectar seu sistema operacional (SO) e dar a você o instalador apropriado (se por algum motivo isso não ocorrer, clique no botão de download e pegue o que você precisa). Rode o instalador. É isso, você instalou o Node.js e o, igualmente importante, NPM - Node Package Manager - que permite que você adicione todo tipo de complemento ao Node de forma rápida e fácil. PASSO 2 - INSTALANDO O EXPRESS Agora que temos o Node rodando, nós precisamos do resto das coisas para criar, realmente, um website que funcione. Para fazer isso, vamos instalar o Express, que é um framework que pega o Node a partir de uma aplicação simples e o transforma em algo que se comporta mais como um servidor web que todos nós usamos (e talvez um pouco mais que isso). Nós precisamos iniciar com o Express, pois iremos utilizar seu scaffolding (estrutura) para obter todo o resto que queremos (mais sobre isso em um instante). Então, digite isso: $ npm install -g express Isso instala algumas funcionalidades do núcleo do Express junto com a instalação do Node, tornando -o disponível globalmente, então podemos usá-lo em qualquer lugar que quisermos. Você vai ver um monte de texto em seu prompt de comando, vários http 304 e GETs. Tudo bem. O Express está agora instalado e disponível. PASSO 3 - CRIANDO UM PROJETO EXPRESS Vamos usar Express e Jade, mas não o pré-processador CSS Stylus (que as pessoas geralmente usam nesta configuração). Temos que usar o Jade ou outro motor de templates para ter acesso aos dados baseados em Node/Express. Jade não é difícil de se aprender se você já conhece HTML. Apenas lembre-se que você realmente tem que ter atenção a indentação, ou coisas vão sair muito erradas. De qualquer forma, continue no seu diretório onde está armazenando sua aplicação node e digite isso: $ express --sessions nodetest1 Aperte enter e veja o que acontece. Irá aparecer algo como isso: eo_op:~/estudos/nodejs $ express --sessions nodetest1 create : nodetest1 create : nodetest1/package.json create : nodetest1/app.js create : nodetest1/routes create : nodetest1/routes/index.js create : nodetest1/routes/user.js create : nodetest1/views create : nodetest1/views/layout.jade create : nodetest1/views/index.jade create : nodetest1/public/images create : nodetest1/public/javascripts create : nodetest1/public create : nodetest1/public/stylesheets create : nodetest1/public/stylesheets/style.css install dependencies: $ cd nodetest1 && npm install run the app: $ node app PASSO 4 - EDITANDO AS DEPENDÊNCIAS Tudo bem, agora que temos uma estrutura básica, mas ainda não terminamos. Você vai notar que a rotina de instalação do Express criou um arquivo chamado package.json em seu diretório nodetest1. Abra este arquivo, ele vai parecer com isso: { "name": "application-name", "version": "0.0.1", "private": true, Página 8 de Indroducao-NodeJS "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "express": "3.4.8", "jade": "*" } } Este é um arquivo básico JSON que descreve seu aplicativo e suas dependências. Nós precisamos adicionar algumas coisas a ele. Especificamente, o MongoDB e Monk. Vamos fazer nosso objeto dependencies se parecer com isso: "dependencies": { "express": "3.4.4", "jade": "*", "mongodb": "*", "monk": "*" } PASSO 5 - INSTALAR AS DEPENDÊNCIAS Agora definimos nossas dependências e estamos prontos para começar. Note que o astericos diz ao NPM "pegue a última versão" quando você roda a instalação, que estamos prestes a fazer. Volte para seu prompt de comando, cd para o diretório nodetest1 e digite isso: $ npm install Será impresso uma tonelada de coisas. Isto por causa que está sendo lido nosso arquivo JSON que acabamos de editar e a instalação de todas as coisas listadas no objeto dependencies (sim, incluindo o Express - nós instalamos o material de alto nível usando a flag -g, mas ainda temos que instalar algum código que será necessário para este projeto em particular). Uma vez que o NPM percorreu seu caminho, você terá um diretório node_modules que contém todas as suas dependências para este tutorial. Agora você tem uma aplicação em pleno funcionamento e esperando para ser rodada. Vamos testá -la! Vá para o diretório nodetest1 e digite: $ node app.js Aperte enter. Você vai obter isso: Express server listening on port 3000 Incrível! Abra seu navegador e digite http://locahost:3000. Agora você verá a página de boas vindas do Express. Você tem agora seu próprio servidor web com Node.js, com a engine Express e o pré-processador Jade instalados. Não é tão difícil, né? PARTE 2 - OK. LEGAL. VAMOS FAZER O "HELLO WORLD!" Abra seu editor de texto ou IDE favorita. Eu gosto muito do Sublime Text. Vá para o diretório nodetest1 e abra o arquivoapp.js. Esse é como o coração da sua app. Não há muitas surpresas lá. Aqui temos uma parte do que você irá ver lá: var express = require('express'); Página 9 de Indroducao-NodeJS var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var http = require('http'); var path = require('path'); Isso cria muitas variáveis básicas do JavaScript e as liga a certos pacotes, dependências, funcionalidades do Node e rotas. Rotas são como uma espécie de combinação de modelos e controladores nesta configuração - elas direcionam o tráfico e também contém alguma lógica de programação (você pode estabelecer uma arquitetura MVC mais tradicional com o Express se você quiser. Isso está fora do escopo deste artigo). Voltando ao momento onde nós configuramos este projeto, o Express criou todas essas coisas para nós. Vamos ignorar totalmente a rota user por agora e trabalhar somente na rota de nível superior (controlado por nodetest1/routes/index.js). nodetest1/app.js var app = express(); Isto é importante, pois configura o Express e atribui nossa variável app a ele. A próxima seção usa esta variável para configurar um monte de coisas do Express. nodetest1/app.js // todos ambientes app.set('port', process.env.PORT || 3000 ); app.set( 'views', path.join( __dirname, 'views' ) ); app.set( 'view engine', 'jade' ); app.use( express.favicon() ); app.use( express.logger( 'dev' ) ); app.use( express.bodyParser() ); app.use( express.methodOverride() ); app.use( app.router ); app.use( express.static( path.join( __dirname, 'public' ) ) ); Isso configura a porta, que diz ao app onde encotrar as views, que engine usar para renderisar estas views (Jade), e chama alguns métodos para deixar as coisas funcionando. Note também que a linha final está dizendo ao Express para servir objetos estáticos no diretório public. Por exemplo, as imagens no diretório ../nodetest1/public/images. Mas elas são acessadas pela url http://localhost:3000/images. NOTA: Você vai precisar mudar esta linha: app.js app.use( express.bodyParser() ); para: app.use( express.urlencoded() ); Em razão de evitar alguns avisos em seu console Node quando você rodar a aplicação. Isto é devido a algumas mudanças futuras do Express e seus plugins. Se você não fizer esta mudança, sua aplicação vai continuar rodando, mas você irá ver texto sobre futuras desaprovações (deprecations) toda vez que você rodar isso. app.js // development only if ( 'development' == app.get( 'env' ) ) { app.use( express.errorHandler() ); } Isso permite que você faça alguma checagem de erro durante o desenvolvimento. É importante, mas pela proposta deste tutorial não vamos fazer nada com isso. app.js app.get( '/', routes.index ); app.get( '/users', user.list ); Isso diz a app quais rotas usar quando uma URI particular é solicitada. Note que a variável "user" está declarada acima, e é mapeada para /routes/user.js - nós vamos chamar a função de lista definida neste arquivo. Ou estaríamos se estivéssemos acessando a página de usuários, mas estamos ignorando-a, lembra? Página 10 de Indroducao-NodeJS estaríamos se estivéssemos acessando a página de usuários, mas estamos ignorando-a, lembra? app.js http.createServer( app ).listen( app.get( 'port' ), function () { console.log( 'Express server listening on port ' + app.get( 'port' ) ); } ); Por último, mas não menos importante, isso cria nosso servidor http e o lança. Bons tempos! Agora então, vamos fazer algumas coisas. Não vamos fazer apenas um "Hello, World!" na nossa página index. Ao invés disso, vamos usar essa oportunidade para aprender um pouco mais sobre rotas e ver como o Jade trabalha para colocar as páginas em conjunto. Primeiro, vamos adicionar uma linha para manipular uma nova URI. Em baixo da seção app.get() no arquivo app.js, adicione esta linha: app.get( '/helloworld', routes.helloworld ); Aperte ctrl c para encerrar o app.js em sua linha de comando, e então reinicie o processo e vá atéhttp://localhost:3000/helloworld. Você deve obter um interessante erro do node e uma quebra na linha de comando. Isto porque nós não modificamos nossa rota para manipular esta requisição. Vamos fazer isso! Em seu editor de texto, abra sua pasta routes, encontre index.js e abra-o. Ele vai se parecer com isso: index.js /* * GET home page. */ exports.index = function( req, res ){ res.render( 'index', { title: 'Express' }); }; Muito escasso, certo? Vamos adicionar uma nova página. Minha abordagem preferida é adicionar um novo arquivo de rota para o diretório de nível superior, mas nós não criamos um diretório helloworld completo nas views, então vamos apenas usar a rota index. No fim do arquivo, adicione este código: exports.helloworld = function ( req, res ) { res.render( 'helloworld', { title: 'Hello, World!' } ); }; Isso é tudo que temos que fazer para rotear esta URI, mas nós não temos nenhuma página para o res.render renderizar. É ai que o Jade entra. Abra sua pasta views, e então abra o arquivo index.jade. Antes de fazer qualquer coisa, salve este arquivo como helloworld.jade. Agora dê uma olhada no código: helloworld.jade extends layout block content h1= title p Welcome to #{title} Isso é muito simples. Ele usa o extends e faz o arquivo layoud.jade como um template, e então dentro do bloco contentdefinido no arquivo layout, ele altera o header e o p (parágrafo). Note o uso da variável title que configuramos acima, em nossa rota index.js. Isso significa que não temos que mudar sempre o texto para mostrar coisas diferentes na página home. Mas vamos mudar um pouco de qualquer forma para: p Hello, World! Welcome to #{title} Salve o arquivo, vá para o terminal e encerre sua aplicação ctrl c. Agora digite: node app.js É importante mencionar: mudanças nos templates Jade não necessitam do reinício do servidor, mas basicamente toda vez que você mudar um arquivo .js, como app.js ou um arquivo de rota, você vai precisar reiniciar para ver as mudanças. Agora, com o servidor reiniciado, navegue até http://localhost:3000/helloworld e divirta-se com o texto Página 11 de Indroducao-NodeJS Agora, com o servidor reiniciado, navegue até http://localhost:3000/helloworld e divirta-se com o texto completamente estúpido mostrado: Ok! Agora temos nossa rota nos levando para nossa view. Vamos fazer alguma modelagem. Eu vou dar um momento para você, caso precise reparar seu cabelo ou maquiagem. Nota do tradutor: (Y) AUSHDUHASUDHUASHDUAHSUDHAUSHDUHASUDHUASHD PARTE 3 - CRIANDO NOSSO DB E LENDO ALGO DELE PASSO 1 - INSTALAR MONGODB Vamos deixar um pouco nosso editor de texto e ir para nosso terminal. Bem, primeiro vamos para nosso browser, no endereço http://mongodb.org/ e fazer o download do Mongo. Click no link de downloads no menu principal e pegue a versão de produção que se encaixa com seu sistema. Para o Windows 8 com um processador 64 -bit, nós vamos usar o "64-bit *2008R2+". Isso irá lhe fornecer um arquivo .zip, que você deve descompactar para um diretório temporário. Então você pode criar um diretório no qual o Mongo vai permanecer pra sempre depois de armazenar o Mongo. Você pode usarc:\mongo ou c:\program files\mongo ou qualquer outra coisa louca que você quiser. Isso não importa na verdade - O Mongo é bem pequeno, e vamos armazenar nosso banco de dados no nosso diretório nodetest1. De qualquer forma, copie os arquivos da pasta bin dentro do seu diretório temporário para onde você quer que o Mongo fique, e você está pronto. Você instalou o Mongo. Agora vamos fazer isso funcionar. PASSO 2 - RODANDO MONGOD e MONGO No seu diretório nodetest1, cria um subdiretório chamado data. Então navegue até o diretório em que você colocou seus arquivos do MongoDB. Deste diretório, digite o seguinte: mongod --dbpath c:\node\nodetest1\data Você vai ver que o servidor Mongo inicia. Pode demorar um pouco se for a primeira vez, porque ele tem que fazer algumas pre-alocações de espaço e algumas tarefas de limpeza. Uma vez que isso disser "[initandlisten] waiting for connections on port 27017", tudo está feito. Não há nada mais para se fazer; o servidor está rodando. Agora você pode abrir um segundo terminal. Navegue novamente até o diretório de instalação do Mongo, e digite: mongo Você vai ver algo assim: c:\mongo>mongo MongoDB shell version: 2.4.5 connecting to: test Adicionalmente, se você está prestando atenção em sua instância mongod, você vai ver que ele menciona que a conexão foi estabilizada. Tudo certo, você tem o MongoDB funcionando, e conectou a ele com o client. Nós vamos usar o client manualmente para trabalhar no nosso banco de dados, mas não é necessário para rodar o website. Somente o mongod é necessário para isso. PASSO 3 - CRIANDO UM BANCO DE DADOS Não se preocupe com "connecting to: test"... este é apenas o db padrão decidido pelo MongoDB para ser usado se Página 12 de Indroducao-NodeJS Não se preocupe com "connecting to: test"...este é apenas o db padrão decidido pelo MongoDB para ser usado se você não especificar um na linha de comando, o qual não fizemos porque não é importante por agora. Na verdade, ele nem mesmo cria o db "test", a menos que você adicione um registro. Seria totalmente correto trabalhar neste db por agora, mas vamos criar um próprio nós mesmos. No seu console Mongo, digite o seguinte: use nodetest1 Agora estamos usando o db nodetest1. Igualmente ao test, nada existe ainda. Para criar o db, temos que adicionar algum dado. Vamos começar fazendo isso diretamente pelo Mongo Client. PASSO 4 - ADICIONANDO ALGUNS DADOS O que mais gosto sobre o MongoDB é que ele usa JSON em sua estrutura, que significa que isso foi instantâneamente familiar para mim. Se você não está acostumando com JSON, você terá que fazer alguma leitura, pois isso está fora do escopo deste tutorial. Vamos adicionar um registro para nossa coleção. Para a proposta deste tutorial, vamos apenas ter um simples db com nomes de usuários e endereços de e-mail. O formato de nossos dados vão ser dessa forma: { "_id" : 1234, "username" : "cwbuecheler", "email" : "cwbuecheler@nospam.com" } Você pode criar sua própria atribuição _id se você realmente quiser, mas eu acho melhor deixar para o Mongo fazer estas coisas. Isso vai fornecer um identificador único para cada simples entrada do nível superior da sua coleção. Vamos adicionar uma e ver como isso funciona. No seu Mongo client, digite isso: db.usercollection.insert({ "username" : "testuser1", "email" : "testuser1@tesdomain.com" }) Algo importante de se notar aqui: este db significa nosso banco de dados, que como mencionado acima, nós definimos como nodetest1. A parte usercollection é nossa coleção. Note que não existe um passo onde nós criamos a coleção "usercollection". Isso porque a primeira vez que adicionamos isso, ele já irá se auto -criar. Prático. Ok, aperte enter. Assumingo que tudo ocorreu corretamente, você deve ver... nada. Isso não é muito animador, então digite isso: db.usercollection.find().pretty() No caso de você estar curioso, o método .pretty() nos fornece quebra de linha. Isso vai retornar: { "_id" : ObjectId("5202b481d2184d390cbf6eca"), "username" : "testuser1", "email" : "testuser1@testdomain.com" } Exceto, claro, que seu ObjectID vai ser diferene deste mencionado, pois o Mongo vai gerará -lo automaticamente. Isto é tudo que temos que escrever para o MongoDB a partir do client app, e se você já trabalhou com serviços JSON antes, você provavelmente estará pensando "ó, wow, isso será fácil de implementar na web." ... você está certo! Uma nota rápida sobre a estrutura do DB: obviamente ao longo da jornada você não vai armazenar nada em nível alto. Existem toneladas de recursos na internet para o projetos de esquema para o MongoDB. Google é seu amigo! Agora que temos um registro, vamos adicionar um pouco mais. Em seu console Mongo, digite o seguinte: newstuff = [{ "username" : "testuser2", "email" : "testuser2@testdomain.com" }, { "username" : "testuser3", "email" : "testuser3@testdomain.com" }] db.usercollection.insert(newstuff); Note que, sim, nós passamos um array com múltiplos objetos para nossa coleção. Prático! Outro uso dedb.usercollection.find().pretty() vai mostrar todos os três registros: { "_id" : ObjectId("5202b481d2184d390cbf6eca"), "username" : "testuser1", Página 13 de Indroducao-NodeJS "username" : "testuser1", "email" : "testuser1@testdomain.com" } { "_id" : ObjectId("5202b49ad2184d390cbf6ecb"), "username" : "testuser2", "email" : "testuser2@testdomain.com" } { "_id" : ObjectId("5202b49ad2184d390cbf6ecc"), "username" : "testuser3", "email" : "testuser3@testdomain.com" } Agora, vamos começar realmente a interagir com o servidor web e o site que configuramos anteiormente. PASSO 5 - LIGANDO O MONGO COM O NODE Aqui é onde a borracha encontra o asfalto. Vamos começar a criar uma página que apenas mostra nossas entradas no DB de forma bem ligeira. Aqui o HTML que vamos gerar: <ul> <li><a href="mailto:testuser1@testdomain.com">testuser1</a></li> <li><a href="mailto:testuser2@testdomain.com">testuser2</a></li> <li><a href="mailto:testuser3@testdomain.com">testuser3</a></li> </ul> Eu sei que isso não é ciência astronáutica, mas esta é a questão. Vamos fazer apenas um simples ler -e-escrever do DB neste tutorial, não tentar fazer um website inteiro. Primeiramentem precisamos adicionar algumas linhas no nosso arquivo principalapp.js - o coração e a alma da nossa app - em favor de realmente nos conectar-mos a instância MongoDB. Abra o arquivoapp.js e no topo dele você vai ver: var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var http = require('http'); var path = require('path'); Agora adicione estas 3 linhas: var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var http = require('http'); var path = require('path'); // Novo código var mongo = require('mongodb'); var monk = require('monk'); var db = monk('localhost:27017/nodetest1'); Estas linhas dizem que nossa app vai conversar com o MongoDB, e vamos usar o Monk para fazer isso, e nosso banco de dados está localizado em localhost:27017/nodetest1. Note que 27017 é a porta que sua instância MongoDB deve estar rodando. Se por algum motivo você a mudou, obviamente use esta porta então. Agora olhe para a parte de baixo do arquivo, onde você tem isso: app.get('/', routes.index); app.get('/users', user.list); app.get('/helloworld', routes.helloworld); Adicione a seguinte linha no final: app.get('/userlist', routes.userlist(db)); Esta linha diz que quando o usuário navegar para /userlist, nós vamos passar a variável "db" (nosso objeto do banco de dados) para a rota userlist. Mas nós NÃO temos uma rota userlist ainda, então vamos criar uma. PASSO 6 - PUXANDO DADOS DO MONGO E MOSTRANDO-OS Abra o arquivo nodetest1/routes/index.js em seu editor. Ele tem a rota index, e a rota /helloworld. Vamos adicionar uma terceira: exports.userlist = function(db) { return function(req, res) { Página 14 de Indroducao-NodeJS return function(req, res) { var collection = db.get('usercollection'); collection.find({},{},function(e, docs){ res.render('userlist', { "userlist" : docs }); }); }; }; Ok... Isso está ficando bem complicado. Tudo que isso está realmente fazendo, porém, é rodar uma função que envolve para passarmos nossa variável db, e então fazer a página renderizar como os outros dois "exports" neste arquivo de rota. Nós então dizemos em cada coleção que queremos usar ('usercollection') e fazer um find, então retornando o resultado como a variável docs. Uma vez que temos estes documentos, nós então vamos renderizar uma userlist (que vai precisar de um template Jade correspondente), dando isso a esta userlist para que ela possa trabalhar, e passando nosso documento do db como variável. Vamos agora configurar nosso template Jade. Navegue até nodetest1/views e abra index.jade. Após isso, salve imediatamente este arquivo como userlist.jade. Então edite o HTML para se parecer com isso: extends layout block content h1. User List ul each user, i in userlist li a(href='mailto:#{user.email}')= user.username Isto está dizendo que vamos receber um conjunto de documentos chamado de userlist do nosso arquivo roteador, e então para entrada (nomeado 'user' durante o loop), vamos pegar o valor 'email' e 'username' do objeto e colocar em nosso html. Nós também temos a contagem - i - útil,mas neste caso nós não precisamos dela. Tudo está configurado. Salve o arquivo, e vamos reiniciar nosso servidor node. Se lembra de como fazer isso? Vá para o terminal e aperte ctrl c para encerrar o processo de app.js se ele ainda estiver rodando. Então digite: $ node app.js Agora abra o seu navegador e vá para http://localhost:3000/userlist e maravilhe-se com o resultado. Você está agora puxando dados do DB e mostrando na sua página web. Muito bom! Há mais uma coisa que eu gostaria muito de cobrir neste tutorial, mas como ele já está tão longo quanto a Bíblia, vou explicar brevemente isso aqui. Você pode facilmente mudar sua view userlist de uma página manipulada pelo Express e template Jade para uma boa e velha resposta JSON. Você pode então acessar isso com AJAX e manipular no lado do cliente, com jQuery por exemplo, ao invés de no lado do servidor. Eu não vou me opor se você quiser fazer assim, mas não posso cobrir isso, então vou apenas apontar o caminho para res.json e dizer "siga por aqui, não é tão difícil". Vamos acabar com isso. PARTE 4 - O SANTO GRAAL - ESCREVENDO NO DB Escrever no banco de dados não é difícil. Essencialmente nós precisamos configurar uma rota que pega um POST, Página 15 de Indroducao-NodeJS Escrever no banco de dados não é difícil. Essencialmente nós precisamos configurar uma rota que pega um POST, ao invés de um GET. Nós podemos usar AJAX aqui, e honestamente é minha preferência na maioria das vezes... mas este é realmente um tutorial diferente, então vamos manter uma abordagem de colocar e mostrar resultados. Mais uma vez, não tão difícil adaptar essas coisas para funcionarem da maneira que você quer. PASSO 1 - CRIE SUA ENTRADA DE DADOS Vamos passar rapidamente aqui: dois inputs feios e sem estilo mais um botão submit. Estilo 1996. Após isso, vamos começar com o app.get(); e então dar algo para ser pego. Abra o app.js e encontre a parte das chamadas app.get(), e adicione isso no final delas: app.get('/newuser', routes.newuser); Então você vai ter: app.get('/', routes.index); app.get('/users', user.list); app.get('/helloworld', routes.helloworld); app.get('/userlist', routes.userlist(db)); // Novo código app.get('/newuser', routes.newuser); Como todas as requisições app.get, nós precisamos ajustar a rota para reconhecer o que servir. Abra routes/index.js e adicione o seguinte: exports.newuser = function ( req, res ) { res.render( 'newuser', { title: 'Add New User' } ); }; Agora nós apenas precisamos de um template. Abra views/index.jade, salve como newuser.jade, e substitua todo o arquivo com este conteúdo: extends layout block content h1= title form#formAddUser( name='adduser', method='post', action='/adduser' ) input#inputUserName( type='text', placeholder='username', name='username' ) input#inputUserEmail( type='text', placeholder='useremail', name='useremail' ) button#btnSubmit( type='submit' ) submit Aqui nós criamos um formulário com o ID "formAddUser" (eu gosto de nomear meus IDs com o tipo de coisa que ele está identificando. É uma peculiaridade pessoal). O method é o post e a action é adduser. Bastante simples. Abaixo disso nós definimos nossos dois inputs e nosso botão. Se você reiniciar o servidor node e ir para http://localhost:3000/newuser, você vai ver nosso formulário em toda sua glória. PASSO 2 - CRIANDO NOSSAS FUNÇÕES DB Ok, o mesmo processo de antes. Primeiro vamos editar o app.js, então nosso arquivo route, e então nosso template Jade. Exceto que não existe um template Jade aqui porque nós estamos postando e então encaminhando. Veja abaixo. Vai tudo fazer sentido! Vamos começar: Abra app.js e mais uma vez encontre a pilha de chamadas app.get: app.get('/', routes.index); app.get('/users', user.list); Página 16 de Indroducao-NodeJS app.get('/users', user.list); app.get('/helloworld', routes.helloworld); app.get('/userlist', routes.userlist(db)); app.get('/newuser', routes.newuser); Agora adicione o seguinte em baixo desta lista: app.post('/adduser', routes.adduser(db)); Note que isso é um app.post, não um app.get. Se você quer separar essa parte dos app.get com um comentário ou nova linha, eu não vou lhe impedir. Vamos configurar nossa rota. Volte para routes/index.js para criarmos nossa função de inserção. Essa é grande, então eu comentei o código bem cuidadosamente. Aqui está: exports.adduser = function (db) { return function (req, res) { // Pega os valores do form. Eles dependem do atributo "name" var userName = req.body.username; var userEmail = req.body.useremail; // Configura nossa coleção var collection = db.get('usercollection'); // Envia ao DB collection.insert({ "username" : userName, "email" : userEmail }, function (err, doc) { if (err) { // Se isso falhar, retorna um erro res.send("Ocorreu um problema ao adicionar informação ao banco de dados"); } else { // Se funcionar, configura o header para a barra de endereço não continuar dizendo /adduser res.location("userlist"); // E depois a página de sucesso res.redirect("userlist"); } }); }; }; Obviamente no mundo real você vai querer de uma tonelada a mais de validação, checagem de erros, e coisas do tipo. Você vai querer checar por nomes de usuários e emails duplicados, por exemplo, e também checar se a entrada de email parece com uma legítima. Mas isso vai funcionar por agora. Como você pode ver, adicionando os dados com sucesso ao DB, vamos em seguida retornar o usuário a página userlist, onde ele deve ver a nova entrada adicionada. Existem formas mais suvaes de se fazer isso? Com certeza, porém vamos ficar nessa forma básica por agora. Agora, vamos adicionar alguns dados! PASSO 3 - CONECTANDO E ADICIONANDO DADOS AO SEU BANCO DE DADOS Assegure-se que o mongod está rodando! Então volte para seu terminal, encerre o processo do servidor node e volte a rodá-lo, reiniciando-o: $ node app.js Assumindo que seu servidor está rodando, e deve estar, retorne para o navegador e vá para http://localhost:3000/newusernovamente. Temos nosso empolgante formulário, exatamente como antes, exceto que agora vamos preencher com alguns valores antes de enviarmos ele. Eu coloquei o username como "noderocks" e o email como "noderocks@rockingnode.com"... você pode colocar o que quiser. Página 17 de Indroducao-NodeJS Clique em submit, e veja... voltamos ao /userlist e essa é nossa nova entrada! Estamos oficialmente lendo e escrevendo a partir do nosso banco de dados MongoDB usando Node.js, Express e Jade. Você é agora o que as crianças chamam de desenvolvedor "full stack" (provavelmente não um BOM, por enquanto, mas eu não prometi isso). Parabéns. Sério. Se você seguiu todo este caminho, e se realmente prestou atenção no que você fez e não apenas copiou e colou código, você deve ter agora uma compreensão sólida de rotas e views, ler do banco de dados e postar no DB. Isso étudo que você precisa para começar a desenvolver qualquer app que você queira. Eu não sei você, mas acho isso realmente muito legal. PARTE 5 - PRÓXIMOS PASSOS A partir daqui, existem milhões de diferentes direções que você pode seguir. Você pode checar sobre Mongoose, que é outro pacote de manipulador Mongo para Node/Express. É maior que o Monk, mas também faz mais coisas. Você pode checar sobre Stylus, o pré-processador CSS que vem com o Express. Você pode pesquisar "Node Express Mongo Tutorial" e ver algumas coisas. Apenas continue explorando e construindo! Eu espero que este tutorial tenha sido útil. Eu o escreviporque eu poderia ter usado isso quando comecei, e não consegui encontrar algo parecido com este nível, ou tenha quebrado as coisas em longos, longos, looongos detalhes. Se você chegou até aqui, obrigado por isso! Veja o fim do artigo original para ler a lista de agradecimentos e indicações. Link De <https://github.com/ericdouglas/traduz-ai/blob/master/nodejs/002-simples-guia-nodejs-jade-express-mongodb.md> Página 18 de Indroducao-NodeJS por Cosme Lopes O que é Node.js? Node.js é uma plataforma para desenvolvimento de aplicações server- side baseadas em rede utilizando JavaScript e o V8 JavaScript Engine, ou seja, com Node.js podemos criar uma variedade de aplicações Web utilizando apenas código em JavaScript. Em uma primeira análise essa informação pode não parecer tão interessante, uma vez que existem diversas outras maneiras em que esses tipos de serviços podem ser implementados. Mas se pensarmos um pouco mais sobre as demandas de aplicações na internet e o modo em que o código em JavaScript pode ser estruturado, vamos nos deparar com uma gama de novas possibilidades para desenvolvimento Web, e provavelmente nos juntar à crescente comunidade que tem adotado essa plataforma. Embora Node.js tenha muito em comum com os servidores tradicionais como Apache e IIS, podemos entender melhor essa relação se considerarmos as diferenças. Node.js é extremamente simples, por isso pode não ser a solução ideal para todos os casos. Enquanto os servidores tradicionais são mais robustos e preparados para situações mais complexas, e isso invariavelmente vai consumir mais recursos das máquinas do que Node.js. Outra importante diferença está no fato do Node ser single threaded. Embora isso possa parecer uma desvantagem em um primeiro momento, o que percebemos ao desenvolver com Node.js é que isso simplifica extremamente a construção da aplicação, e por Node.js utilizar uma abordagem não obstrutiva, essa diferença vai ser imperceptível na maioria dos casos. V8 JavaScript Engine É o interpretador de JavaScript open source implementado pelo Google em C++ e utilizado peloChrome. O que sem dúvidas gera uma grande expectativa em relação ao desempenho do Node.js. Instalando o Node.js A instalação do Node.js é extremamente simples graças ao fato de o V8 JavaScript Engine ser completamente multi-plataforma, tudo que você precisa fazer é visitar a página oficial do Node.js, clicar em “INSTALL” e seguir as instruções. O que é Node.js e saiba os primeiros passos terça-feira, 12 de julho de 2016 22:22 Página 19 de Indroducao-NodeJS “INSTALL” e seguir as instruções. Após a instalação, basta executar o seguinte comando no seu terminal para verificar se foi instalado corretamente: $ node -v1. > v0.10.262. deve retornar a versão do node que foi instalada, como por exemplo v0.10.26. O web server ‘Olá mundo!’ Ok, então vamos construir alguma coisa. Nosso primeiro exemplo é um servidor que retorna a string ‘Olá mundo’ para qualquer requisição. Para fazer isso utilizando Node você vai precisar de criar um arquivo JavaScript que pode ser chamado olanode.js e de três minutos do seu tempo. Escreva o seguinte código no seu arquivo: var http = require('http');1. http.createServer(function(req,res) {2. res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); 3. res.end('Olá mundo!');4. }).listen(3000);5. console.log('Servidor iniciado em localhost:3000. Ctrl+C para encerrar…');6. Para executar o seu programa Node basta o seguinte comando no seu terminal: Página 20 de Indroducao-NodeJS $ node olanode.js1. Para testar seu servidor você pode acessar localhost:3000 no seu navegador ou utilizar linha de comando com o comando curl (em uma nova instância do terminal) como mostrado a seguir: $ curl http://0.0.0.0:3000/1. > Olá mundo!2. Caso você prefira retornar algum html válido para o navegador, basta alterar 'text/plain' para'text/html' no código acima e utilizar uma tag html legal como <h2>, como foi feito a seguir: var http = require('http');1. 2. http.createServer(function(req,res) {3. res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); 4. res.end('<h2> Olá mundo! </h2>');5. }).listen(3000);6. 7. console.log('Servidor iniciado em localhost:3000. Ctrl+C para encerrar…’);8. Agora basta voltar ao seu navegador e ver o resultado. Orientado a eventos e não obstrutivo Orientado a eventos Vamos aproveitar este momento de euforia após a construção do seu primeiro servidor para aprender um pouco mais sobre Node.js. Página 21 de Indroducao-NodeJS Quando estamos desenvolvendo com Node.js devemos utilizar uma abordagem orientada a eventos, isso quer dizer que o desenvolvedor precisa conhecer os eventos que serão emitidos em diferentes momentos da execução e também saber como ouvi-los para executar as operações necessárias. Um bom exemplo de orientação a eventos está na construção de interfaces de usuário. Muitas vezes utilizamos elementos como por exemplo os botões que ao serem clicados emitem um evento do tipo click ao qual podemos ouvir e executar alguma operação. No nosso exemplo anterior utilizamos esse conceito quando chamamos método listen do objeto do tipo web server e passamos como parâmetro a porta 3000, com isso fizemos que a nossa aplicação ouvisse ao evento que é emitido sempre que alguém faz uma requisição nolocalhost:3000 e a nossa resposta foi servir a string ou a página html. Este evento é chamadorequest. Para ilustrar estes conceitos, podemos escrever o nosso exemplo anterior em uma sintaxe alternativa da seguinte forma: var http = require('http');1. 2. var server = http.createServer();3. 4. server.on('request', function(req,res) {5. res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); 6. res.end('<h2> Olá mundo! </h2>');7. });8. 9. server.listen(3000);10. 11. console.log('Servidor iniciado em localhost:3000. Ctrl+C para encerrar…’);12. Dessa forma podemos ver claramente a maneira em que o Node.js opera para servir a sua página. Utilizamos o método on do nosso objeto server para ouvir ao evento request e fazer as operações. E definimos que estamos servindo na porta 3000. Não obstrutivo Todos os recursos presentes no Node.js e também a maioria das bibliotecas feitas para ele adotaram um padrão não obstrutivo de escrever código, isso quer dizer que em Node.js você geralmente vai conseguir estruturar seu código de uma maneira que operações que não dependem de nada que está sendo executado possam ser executadas de forma independente. Para mostrar um pouco como isso funciona, vamos um programa que escreve duas frases no terminal, porém uma dessas frases precisa ser Página 22 de Indroducao-NodeJS escreve duas frases no terminal, porém uma dessas frases precisa ser carregada da memória antes de ser impressa. var frase;1. 2. carregaFrase = function (callback) { 3. setTimeout(function() {4. //Simula leitura da frase no banco de dados.5. frase = "Minha frase obstrutiva";6. callback();7. }, 3000)8. }9. 10. imprimeFrase = function () {11. console.log(frase);12. }13. 14. carregaFrase(imprimeFrase);15. 16. console.log(“Olá");17. Nesse exemplo foi criada uma função chamada carregaFrase cujo objetivo é ler uma determinada frase de uma fonte de dados, e uma outra função chamada imprimeFrase que imprime o valor de uma determinada variável no console. Como dependemos da leitura da frase na fonte de dados para imprimir o valor, passamos a função que imprime como parâmetro para a função de leitura para que possamos executar essa função quando a leitura for concluída. Esse tipode função que é passada como parâmetro dessa maneira é chamada de callback. Ao executar este exemplo com Node.js ou qualquer mecanismo JavaScript você vai perceber que a frase “Olá” será impressa antes da outra frase mesmo estando posicionada depois no código, isso se deve ao fato de sua execução não depender de nada enquanto a execução da outra frase depende de uma operação que leva 3 segundos. Este é um exemplo extremamente simples de como criar um código não obstrutivo, portanto use sua imaginação para imaginar cenários em que isso pode ser útil. Observe que no nosso primeiro exemplo com Node.js tanto a função on quanto a funçãocreateServer podem receber uma função de callback. Conclusão Espero que este tutorial tenha sido o suficiente para provocar o seu interesse em aprender mais sobre Node.js. Portanto visite a documentação do Node.js para obter mais informações e exemplos de aplicações dessa plataforma e também a página da Joyent, Página 23 de Indroducao-NodeJS de aplicações dessa plataforma e também a página da Joyent, patrocinadora oficial do projeto. E finalmente, Node.js é um projeto open source, portanto você pode visualizar o código fonte e contribuir no repositório do Node.js no GitHub. De <http://tableless.com.br/o-que-nodejs-primeiros-passos-com-node-js/> Página 24 de Indroducao-NodeJS A primeira encarnação do JavaScript viveu no navegador. Mas este é o contexto. Isso define o que você pode fazer com a linguagem, mas isso não fala muito sobre o que a linguagem em si pode fazer. JavaScript é uma linguagem completa: você pode usar isso em muitos contextos e fazer de tudo, com isso você pode alcançar o que as outras linguagens consegue. Node.js é realmente só mais um contexto: isso permite você rodar código JavaScript em backend, fora do navegador. A fim de executar o JavaScript que você pretende rodar em backend, ele precisa ser interpretado e executado. Isso é o queNode.js faz, fazendo uso da Máquina Virtual V8 da Google, o mesmo ambiente de execução do JavaScript usado pelo Google Chrome. Além disso, Node.js vem com muitos módulos úteis, então você não precisa escrever tudo do começo, por exemplo alguma função que escreva uma string no console. Portanto, Node.js é de fato duas coisas: um ambiente de execução e uma biblioteca. Você pode aprofundar-se cada vez mais neste mundo e descobrir como é fácil e divertido desenvolver aplicações altamente escaláveis em JavaScript com Node. O primeiro passo é instalar o Node e a maneira mais fácil de conseguir isso é instalando o Node.js através do gerenciador de pacotes, porém você também vai poder instalar o Node.js através do GitHub. Feito isso, desenvolva sua primeira aplicação, com apenas 6 linhas de código, através do Exemplo Hello World em Node.js. Você perceberá como é fácil e divertido o desenvolvimento com JavaScript no servidor e não só isso, ele também é altamente eficiênte e escalável por ser um servidor orientado a eventos não bloqueante. Caso você queira conhecer mais sobre eventos e como desenvolver aplicações orientadas a eventos, você pode ler o artigo explicando eventos em Node que poderá te ensinar muito sobre eventos. É claro que tem muito mais a ser descoberto no Node e o objetivo deste artigo é te dar apenas o gostinho bom do prazer de desenvolver em Node, não deixe de acompanhar as comunidades de Node.js e de assinar nosso Feed de notícias para se aprofundar cada vez mais no assunto e ser você também um entusiásta desta tecnologia. Comunidades de Node.js A comunidade internacional de Node.js mantem uma lista sobre node no Google groups, criada por Urban Hafner em Junho de 2009, onde é postado exemplos, discussões, anúncios entre outros assuntos sobre o Node.js. Mas se você está com alguma dúvida você primeiro deve visitar a página wiki do node.js e procurar lá, sua dúvida possívelmente já deve ter sido respondida. Estas páginas são em inglês mas são fundamentais para se ter um conhecimento aprofundado do que está ocorrendo de mais recente no mundo Node. A comunidade brasileira de Node.js também mantém uma lista no Google gorups chamada nodebr, criada por Emerson Macedo em Setembro de 2010. Todas as postagens estão em português e a comunidade assídua está sempre disposta à esclarecer as dúvidas de desenvolvedores brasileiros. Caso você compreenda um pouco de inglês, você pode acessar o site nodecasts e assistir um podcast destinados a iniciantes no mundo Node. O que é Node.js? Node.js é uma plataforma construída sobre o motor JavaScript do Google Chrome para facilmente construir aplicações de rede rápidas e escaláveis. Node.js usa um modelo de I/O direcionada a evento não bloqueante que o torna leve e eficiente, ideal para aplicações em tempo real com troca intensa de dados através de dispositivos distribuídos. Na JSConf 2009 Européia, um programador jovem chamado Ryan Dahl, apresentou um projeto em que estava trabalhando. Este projeto era uma plataforma que combinava a máquina virtual JavaScript V8 da Google e um laço de eventos. O projeto apontava para uma direção diferente das outras plataformas em JavaScript que rodam no servidor: todos I/O primitivos são orientado a evento. Aproveitando o poder e a simplicidade do Javascript, isso tornou tarefas difíceis de escrever aplicações assíncronas em tarefas fáceis. Desde quando foi aplaudido de pé no final do seu discurso, o projeto de Dahl tem recebido uma popularidade e uma aprovação sem precedentes. Que problema o Node pode resolver? Node estabeleceu o objetivo número um que é “fornecer uma maneira fácil para construir programas de rede escaláveis”. Qual é o problema com os programas servidores atuais? Vamos fazer os cálculos. Em linguagens como Java™ e PHP, cada conexão cria uma nova thread que potencialmente tem anexado 2 MB de memória com ela. Em um sistema que tenha 8 GB de RAM, isso põe o número máximo teórico de conexões concorrentes a cerca de 4.000 usuários. E quando o número de usuários aumenta, se você quer que sua aplicação web suporte mais usuários, você tem que adicionar mais e mais servidores. Somado a estes custos também podem haver possíveis problemas técnicos: um usuário pode usar diferentes servidores para cada requisição, então cada recurso compartilhado deve ser compartilhado para todos os servidores. Por todas estas rações, o gargalho em toda a arquitetura de aplicações web (incluindo velocidade de tráfego, velocidade do processador e velocidade da memória) é o número de conexões concorrentes que o servidor pode manipular. Node resolve esta questão trocando a maneira como a conexão é tratada no servidor. Ao invés de criar uma nova OS thread a cada conexão (e alocar a memória anexa a ela), cada conexão dispara um evento executado dentro da engine de processos do Node. Node afirma que nunca vai dar deadlock, já que não há bloqueios permitidos, e ele não bloqueia diretamente para chamadas de I/O. Node também alega que um servidor JavaScript no servidor com Node.js quarta-feira, 13 de julho de 2016 02:00 Página 25 de Indroducao-NodeJS dar deadlock, já que não há bloqueios permitidos, e ele não bloqueia diretamente para chamadas de I/O. Node também alega que um servidor rodando ele pode suportar dezenas de milhares de conexões simultâneas. Então, agora que você tem um programa que pode manipular dezenas de milhares de conexões simultâneas, o que você pode realmente fazer com o Node? Seria incrível se você tivesse uma aplicação web que necessitasse desta quantidade de conexões. Este é um daqueles tipos de problema: “se você tem um problema, não é mais um problema”. O que Node definitivamente não é? Sim, Node é um servidor de programas. Entretanto o produto base do Node definitivamente não é como o Apache ou o Tomcat. Estes servidoressão basicamente servidores ready-to-install e estão prontos para instalar aplicativos instantâneamente. Você pode subir e rodar um servidor em um minuto com estes produtos. Node definitivamente não é isso. Parecido com como o Apache pode adicionar um módulo PHP para permitir desenvolvedores criarem páginas da web dinâmicas, e um módulo SSL para conexões seguras, Node tem o conceito de módulos que podem ser adicionados no núcleo do Node. Há literalmente centenas de módulos para rodarem com o Node, e a comunidade é bastante ativa em produzir, publicar e atualizar dezenas de módulos por dia. Como o Node funciona O Node roda em uma JavaScript V8 VM. Mas espere, JavaScript no servidor? Isso, você leu certo. JavaScript no lado do servidor pode ser um conceito novo para todos que trabalharam exclusivamente com o JavaScript no lado do cliente, mas a idéia em sí não é tão absurda - porque não usar a mesma linguagem de programação no cliente que você usa no servidor? O que é V8? O motor JavaScript V8 é o motor que a Google usa com seu navegador Chrome. Poucas pessoas pensam sobre o que realmente acontece com o JavaScript no lado do cliente. Bem, a engine JavaScript realmente interpreta o código e o executa. Com o V8 a Google criou um ultra-rápido interpretador escrito em C++, com um outro aspecto único: você pode baixar a engine e incorporá-la em qualquer aplicação desejada. Isso não está restrito em rodar em um navegador. Então Node atualmente usa o motor JavaScript V8 escrito pela Google e propõe que seja usado no servidor. Perfeito! Para que criar uma nova linguagem quando há uma boa solução já disponível? Programação orientada a Evento Muitos programadores foram ensinados a acreditar que a programação orientada a objetos é um modelo de programação perfeito e a não usarem nada mais. Node utiliza o que é chamado modelo de programação orientada a evento. Programação orientada a evento no lado do cliente com jQuery: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); O lado do servidor na verdade não é diferente do lado do cliente. Claro que não há botões sendo pressionados e não há campos de texto sendo escritos, mas em um nível mais alto, os eventos estão ocorrendo. Uma conexão é feita - evento! Dado é recebido através da conexão - evento! Data parou de chegar através da conexão - evento! Por que é que este tipo de configuração é ideal para o Node? JavaScript é uma excelente linguagem para programação orientada a evento, porque ela permite funções anônimas e encerramentos, e o mais importante, a sintaxe é familiar para quase todos que já programaram na vida. As funções de callback que são chamadas quando um evento ocorre podem ser escritas no mesmo lugar onde você captura o evento. Fácil para desenvolver, fácil para manter. Sem frameworks complicados de Orientação a Objeto, sem interfaces, nenhum potencial para o excesso de arquitetura de qualquer coisa. Basta escutar um evento, escrever uma função de callback, e o Node toma conta de tudo. De <http://nodebr.com/pagina7/> Página 26 de Indroducao-NodeJS Antes de tentar entender o funcionamento do Node.js temos que compreender uma característica do JavaScript herdada da programação funcional. No JavaScript você pode, por exemplo, passar uma função como parâmetro. Vamos ver alguns exemplos práticos para ver como isso funciona na prática. Podemos fazer alguma coisa como isso no JavaScript: function falar(palavra) { console.log(palavra); } function executar(funcao, valor) { funcao(valor); } executar(falar, "Oi JavaScript!"); Se executarmos nosso código vamos receber a saída impressa no console Oi JavaScript!. Você pode testar este exemplo utilizando seu prompt de comando. O Node.js é um ambiente de execução para usar o JavaScript fora do navegador também! Você pode acessar digitando o comando node no seu console e inicia o console interativo REPL, como no exemplo: > function falar(palavra) { ... console.log(palavra); ...} undefined > function executar(funcao, valor){ ... funcao(valor); ... } undefined > executar(falar, "Oi JavaScript!"); Oi JavaScript! undefined E o nosso console imprimiu a saída esperada: Oi JavaScript! Vamos entender o que está acontecendo neste contexto. O que fizemos aqui foi passar a função falar como o primeiro parâmetro da função executar. Isso é bem diferente de passar o valor retornado return pela função falar. A função falar, então, se tornou uma variável de nome funcao dentro da função executar, e executar pode chamar a função contida na variável adicionando os parênteses na variável: funcao(). E o que são estes undefined no console? Para cada comando dado no console do Node na linha seguinte é impresso o valor retornado return deste comando. Vamos analisar com calma: o primeiro comando foi definir a função falar, após a definição retornou undefined, o segundo comando foi definir a função executar, que também retornou undefined, o terceiro comando que executou a função executar, que executou a função falar contida na variável funcao, que acabou por executar a funçãoconsole.log que imprime no console uma string, mas a função executar em si não tem nenhum valor de retorno, então retornou undefined. Nós podemos passar uma função como parâmetro para outra função usando seu nome, como foi visto no exemplo. Após entender este conceito veremos no exemplo a seguir que esta é a maneira indireta de se fazer isso, nós não precisamos definir a função para depois passar ela como parâmetro, nós podemos definir e passar a função como parâmetro para outra função no mesmo lugar. function executar(funcao, valor) { funcao(valor); } executar( function(palavra) { console.log(palavra) }, "Oi JavaScript!"); Neste exemplo nós definimos a função que nós queremos passar para executar no lugar onde a função espera receber seu primeiro parâmetro. Aqui nós não precisamos nem dar um nome à função passada, por isso esta função é chamada de função anônima. Com estes exemplos podemos observar que no JavaScript é possível passar uma função como parâmetro quando chamamos outra função, e podemos fazer isso atribuindo nossa função à uma variável que pode ser passada, ou simplesmente definindo nossa função bem onde estamos chamando a função que vai recebê-la como parâmetro, usando uma função anônima. JavaScript e você Antes de começarmos a falar sobre assuntos técnicos, vamos usar este post para falar sobre você e seu relacionamento com oJavaScript. Se você, como eu, começou a desenvolver páginas em HTML, há muito tempo atrás, escrevendo documentos HTML estáticos. E foi através dele que você se esbarrou pela primeira vez numa coisa engraçada chamada JavaScript, mas você só o usou de maneira muito simples, adicionando alguma interatividade nas suas páginas da web. E de repente as páginas com conteúdo estático começaram a ficar defasadas, então você começou a buscar como funcionava as coisas com um servidor montando as páginas da web por você, você buscava saber como construir web sites complexos, então você aprendeu uma linguagem de programação como PHP, Ruby, Java e começou a escrever o código de backend (que rodava no servidor). Entretanto nessa caminhada você provavelmente passou os olhos no JavaScript e viu com ele a introdução ao jQuery, Prototypee similares, coisas mais avançadas na terra do JavaScript, e então você começa a perceber que essa linguagem é mais do que um simples window.open(). De qualquer forma, isso tudo pertencia as coisas do frontend, e embora tenha sido bom ter o jQuery ao seu dispor sempre que você quisessetemperar sua página da web, no final do dia você era, no melhor dos casos, um usuário JavaScript, mas não um desenvolvedor JavaScript. E então veio o Node.js. JavaScript no lado do servidor, super excitante não é mesmo? Passando função como parâmetro no JavaScript com Node.js quarta-feira, 13 de julho de 2016 01:59 Página 27 de Indroducao-NodeJS E então veio o Node.js. JavaScript no lado do servidor, super excitante não é mesmo? Você decidiu que estava na hora de aprender o verdadeiro potencial do bom e velho JavaScript. Mas espere, escrever aplicações em Node.js é uma coisa e entender porque elas precisam ser escritas da maneira como são escritas significa entender JavaScript. E dessa vez entender de verdade. Aqui esta o problema: Por causa do JavaScript de fato viver em dois, talvez três vidas (o pequeno e engraçãdo DHTML ajudou em meados da década de 90, o mais sério produto de frontend parecido com jQuery e semelhantes, e agora do lado do servidor), não é fácil achar informação que ajude você a aprender JavaScript da maneira “correta”, em contra partida escrever aplicações Node.js de certo modo ajuda você a sentir-se não somente usando o JavaScript, mas desenvolvendo emJavaScript. Há poraí, é claro, excelentes documentações, a maioria deles em Inglês. Mas apenas documentações, algumas vezes, não é o bastante. Algumas pessoas se sentem mais confortáveis quando encontram tutoriais completos, bem explicativos, abordando desde assuntos para iniciantes até soluções sofisticadas, e, além disso, a maioria dos desenvolvedores brasileiros conseguem absorver melhor a informação aprendendo com documentação em português. Pensando nisto este blog comunitário foi criado, o objetivo dele é permitir uma ajuda mútua entre os desenvolvedores da comunidade brasileira de desenvolvedores Node. Exemplo Hello World em Node.js Este é um programa rápido para garantir que tudo está instalado e funcionando corretamente: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Node.JS!'); }).listen(8080); console.log('Server running at http://localhost:8080/'); Rode o código com o comando de linha do Node em seu prompt de comando: > node hello_node.js Server running at http://localhost:8080/ Agora quando você acessar o endereço http://localhost:8080/ com seu navegador você ler um caloroso Hello Node.JS! Parabéns você instalou o Node.js com sucesso e está pronto para mergulhar nos nós assíncronos do Node. Instalando Node.js através do GitHub Este é um post prático que mostra como instalar o Node.js usando o repositório Git no GitHub. Mac Se você está usando o excelente gerenciador de pacotes homebrew do Mac, você pode instalar Node com apenas um comando:brew install node. Caso contrário, siga os passos abaixo: - Instale o Xcode - Instale o Git - Rode os seguintes comandos em seu prompt de comandos: git clone git://github.com/ry/node.git cd node ./configure make sudo make install Ubuntu No Ubuntu você vai os seguir dois passos abaixo para instalar o Node através do repositório git: Instale todas as dependências:• sudo apt-get install g++ curl libssl-dev apache2-utils sudo apt-get install git-core Rode os seguintes comandos:• git clone git://github.com/ry/node.git cd node ./configure make sudo make install Windows Atualmente você deve usar o cygwin para instalar o Node no Windows. Para fazer isso siga os passos abaixo: Instalar cygwin.• Usar o setup.exe na pasta do cygwin para instalar os seguintes pacotes:• devel → openssl devel → g++-gcc devel →make python → python devel → git Abra a linha de comando do cygwin com Start > Cygwin > Cygwin Bash Shell.• Rode os comandos abaixo para baixar e construir o Node.• git clone git://github.com/ry/node.git cd node Página 28 de Indroducao-NodeJS cd node ./configure make sudo make install Você pode verificar se a instalação foi bem concluída com um simples exemplo Hello World em Node.js! Instalando o Node.js através do gerenciador de pacotes Este post é um guia prático para a instalação do Node.js através do gerenciador de pacotes. Debian Para o Debian Squeeze, sua melhor aposta é em compilar o Node você mesmo (como root): apt-get install make python g++ mkdir ~/nodejs && cd $_ wget -N http://nodejs.org/dist/node-latest.tar.gz tar xzvf node-latest.tar.gz && cd `ls -rd node-v*` ./configure make install Ubuntu Para instalar o Node no Ubuntu, digite as seguintes linhas de comando para instalar a versão estável atual do Node na versão estável atual do Ubuntu: sudo apt-get install python-software-properties sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs npm Caso você precise compilar os módulos Node C++: sudo apt-get install nodejs-dev openSUSE Primeiro adicione o repositório: sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/nodejs/openSUSE_11.4/ NodeJSBuildService Então instale os pacotes: sudo zypper in nodejs nodejs-devel Atente para a versão do seu openSUSE, caso queira você pode ver as versões disponíveis no repositório do openSUSE. Você pode verificar qual sua versão do openSUSE com o comando: more /etc/SuSE-release SuSE Linux 9.1 (i586) VERSION = 9.1 Amazon Linux Primeiro instale o repositório: sudo yum localinstall --nogpgcheck http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm Então instale os pacotes: sudo yum install nodejs-compat-symlinks npm Windows Para usuários Windows, você pode simplesmente fazer o download do instalador do node.js e seguir os passos para a instalação. Você também pode utilizar o chocolatey para instalar Node no Windows usando o comando: cinst nodejs Ou para fazer uma instalação completa com o gerenciador de pacotes NPM do Node: cinst nodejs.install Você pode verificar se a instalação foi bem concluída com um simples exemplo Hello World em Node.js! De <http://nodebr.com/pagina6/> Página 29 de Indroducao-NodeJS Em JavaScript existem duas funções temporizadoras embutidas (built-in timer functions), setTimeout e setInterval que podem ser usadas para chamar funções de retorno (callback functions) após um determinado tempo. Veja um exemplo de uso abaixo: setTimeout(function() { console.log("setTimeout: Ja passou 1 segundo!"); }, 1000); setInterval(function() { console.log("setInterval: Ja passou 1 segundo!"); }, 1000); Este código imprime a seguinte saída: setTimeout: Ja passou 1 segundo! setInterval: Ja passou 1 segundo! setInterval: Ja passou 1 segundo! setInterval: Ja passou 1 segundo! setInterval: Ja passou 1 segundo! ... Você pode ver que os parâmetros são os mesmos para as duas funções. O segundo parâmetro é um número que diz quanto tempo de espera, em milisegundos, vai passar antes de chamar a função passada como primeiro parâmetro. A diferença entre as duas funções é que setTimeout chama a função passada apenas uma vez, enquanto setInterval vai chamar a função passada indefinidamente sempre no intervalo de tempo passado. Você vai poder perceber que o laço de eventos(event loop) do Node vai sempre tentar chamar sua função no tempo pré-determinado por você, porém ele nem sempre vai acertar com precisão milimétrica, pois como o Node roda em apenas uma thread e seu contexto pode estar processando outra função no momento que ele deveria chamar sua função e ele vai precisar processar esta função até o final antes de chamar a próxima função do laço de eventos (event loop). Por isso é muito importante que você sempre escreva funções não bloqueantes para sua aplicação em Node, assim você estará aproveitando todas as vantagens do Node. Você deve ficar atento com a função setInterval porque ela pode causar alguns