Introdução ao Node.js

INFOESTE 2015

Instrutor:
Victor Hugo de Paiva Gonçales

CONTEÚDO PROGRAMÁTICO

  • Introdução
  • Conhecendo Node.js
  • io.js ?
  • Instalando Node.js
  • Conhecendo Sistema de Módulos
  • Criação de Módulos
  • NPM
  • Arquivo package.json
  • Importância de saber utilizar sistema de controle de versão - GIT
  • Programação Assíncrona (callbacks,Promises)
  • Eventos
  • Streams
  • Módulo http - WEB
  • Express
  • Acesso a Base de Dados
  • Aplicações REST
  • Comunicação em tempo real com WebSockets
  • Chat básico em tempo real

Introdução

Atualmente o JavaScript é uma das linguagens de programação mais populares, está presente em diversos ambientes tais como browsers, desktops, servidores, mobile, microcontroladores, "internet das coisas", TV e etc...
No github JavaScript é de longe a linguagem mais popular.
Neste Minicurso será abordado o JavaScript no Servidor, através de Node.js

Conhecendo Node.js

Node.js é uma plataforma de desenvolvimento JavaScript para aplicações em rede(servidores), ideal para aplicações com milhares de conexões simultâneas, é uma tecnologia open-source, multiplataforma (Mac, Windows, Linux), arquitetura orientada a eventos e I/O não-bloqueante.
Noje.js foi criado em 2009 por Ryan Dahl, e é patrocinado pela empresa Joyent*. Utiliza o Google V8 como engine Javascript.
Node.js vem ganhando adoção de grandes empresas como LinkedIn, Wallmart, Groupon, Microsoft, NetFlix, BBC, Paypal e muitas outras

Conhecendo Node.js

Node.js roda de forma assíncrona com I/O não bloqueante, seu código roda numa única Thread, mas as operações I/O assíncronas são feitas pelas Threads do S.O, É como se o Node ficasse em um loop esperando eventos do S.O, Node delega uma tarefa I/O para o S.O. e já faz outra coisa, ele não bloqueia aguardando resposta I/O, você deve delegar um callback para ser executado logo quando a tarefa I/O for concluída pelo S.O.

Conhecendo Node.js

Fonte: What Makes Node.js Faster Than Java?
https://strongloop.com/strongblog/node-js-is-faster-than-java/

Conhecendo Node.js

Utilizado para:

  • Aplicações em tempo real (chat, games multiplayer, monitoramento)
  • Aplicações web/mobile
  • API de serviços REST / web Services - JSON
  • Processos de build
  • Automações de builds/deploy
  • Programas Desktop(NW, Electron), por exemplo Popcorn Time, Atom Editor, Visual Studio Code, Vivaldi Browser e outros

Não é ideal para tarefas que requerem muito processo da CPU.

io.js ? Node.js Foundation?

O io.js é um fork do Node.js, iniciado pelos principais developers do Node.js. E traz as últimas melhorias da linguagem, API e últimas atualizações do V8. Projeto tem como objetivo continuar o desenvolvimento do io.js sob um "modelo de governança aberto" em oposição à administração corporativa. Nos primeiros meses já atraiu mais desenvolvedores ativos que o projeto Node.js teve em toda a sua história.
UPDATE: em maio de 2015, o projeto Node.js e ios.js se juntaram e agora são "Node.js Foundation", com patrocinadores como Linux Foundation, IBM, Microsoft, PayPal, Joyent e outros

Instalando Node.js

A instalação do Node.js é muitos simples em todos os S.O.
Acesse: https://nodejs.org/download/
baixe e instale
next...next...next...

Instalando Node.js

Após a instalação abra o prompt de comando e digite node

  • Objeto process
  • hello world
  • exemplos...

Conhecendo Sistema de Módulos

Node possui um sistema de módulos, que segue o padrão CommonJS, para carregar um módulo utiliza-se a função require( moduloId ), passando o caminho/id do módulo

						var os = require("os"); console.log("total de CPU:" + os.cpus().length);
					

Uma vez carregados eles ficam em cache.

Conhecendo Sistema de Módulos

Tipos de módulos:

  • Módulos nativos (fs,os, path, http,etc...)
  • Módulos criados (arquivos que nós criamos)
  • Módulos de terceiros (que estão na pasta node_modules)

Conhecendo Sistema de Módulos

No require() quando passamos o nome do módulo:

						var nomeDoModulo = require("nomeDoModulo");
					

Primeiro o node procura por um módulo nativo com este nome, caso não exista então ele busca na pasta node_modules, caso não encontre então ele busca na pasta node_modules superior e assim por diante até encontrar ou atingir a raiz do sistema. Quando passamos um caminho relativo ou absoluto node então busca exatamente este módulo.

						var nomeDoModulo = require("./teste/teste2/nomeDoModulo");
					

Criação de Módulos

Para criar um módulo apenas atribuimos para a propriedade module.exports

Exemplo:

						
//meu modulo
var xxxx = "teste";

module.exports = {
	fazAlgo: function(){
		return xxxx;
	}
};
//ou
exports.fazAlgo  = function(){
	return xxxx;
};
						
					

Criação de Módulos

Exemplo modulo com função construtora:

						

var MeuModuloComPrototype = function () {
	this.teste = "teste....";
};

MeuModuloComPrototype.prototype.fazAlgo = function () {
	return this.teste;
};

MeuModuloComPrototype.prototype.fazAlgoDiferente = function () {
	return "fazAlgoDiferente";
};

module.exports = MeuModuloComPrototype;

						
					

NPM

NPM é o gerenciador de pacotes do node, com ele é possível instalar módulos criados por terceiros. Atualmente devido a popularidade do Node.js, o NPM é o gerenciador de pacotes com maior número de pacotes entre todos de outras principais linguagens.
Ele já vem instalado junto com o node.
www.npmjs.com

NPM


http://www.modulecounts.com/

NPM

  • npm install : instala todas as dependencias de um projeto
  • npm install nome_do_módulo : instala um módulo no projeto.
  • npm install -g nome_do_módulo : instala um módulo global.(disponível no prompt)
  • npm install nome_do_módulo --save : instala o módulo no projeto,atualizando o package.json na lista de dependências.
  • npm list : lista todos os módulos do projeto.
  • npm list -g : lista todos os módulos globais.
  • npm remove nome_do_módulo : desinstala um módulo do projeto.
  • npm remove -g nome_do_módulo : desinstala um módulo global.
  • npm update nome_do_módulo : atualiza a versão do módulo.

Arquivo package.json

É o arquivo onde contém as configurações de seu projeto/módulo, ele é utilizado pelo npm.

						
{
  "name": "nome-do-projeto",
  "version": "1.0.0",
  "description": "exemplo de projeto",
  "main": "index.js",
  "scripts": {
    "comando": "ls -la",
    "start" : "node app.js"
  },
  "dependencies": {
    "primus": "*",
    "async": "~0.8.0",
    "express": "4.2.x",
    "winston": "git://github.com/flatiron/winston#master"
  }
}
	 
					

Versionamento

Para controle do número da versão utiliza-se o padrão 'Semantic Versioning'
X.X.X
MAJOR.MINOR.PATCH :
é incrementado da seguinte forma:

  • MAJOR - quando você faz mudanças incompativeis com a versão anterior
  • MINOR - quando você adiciona novas funcionalidades
  • PATCH - quando você faz correções de bugs

~ atualizações a nível de Patch
^ atualizações a nível de Minor

Patch releases: 1.0 or 1.0.x or ~1.0.4
Minor releases: 1 or 1.x or ^1.0.4
Major releases: * or x

http://semver.npmjs.com


Importância de saber utilizar sistema de controle de versão - GIT

GIT é um sistema de controle de versão, atualmente considerado o melhor existente e o mais utilizado nos projetos.
Hoje em dia é fundamental qualquer desenvolvedor ter pelo menos o mínimo de conhecimento de GIT.

Programação Assíncrona (callbacks,Promises)

Todas as operações que são assíncronas necessitam de um callback, que será chamado quando a operação terminar.
Convenciona-se no node que o primeiro parametro do callback deve ser o motivo do erro caso haja, depois os outros parâmetros podem ser qualquer coisa.

						
fs.readFile("message.txt", function (err, conteudo) {
  if (err){
     throw err;
  }
  console.log("conteudo do arquivo: " +conteudo);
});

	
					

Promises

Promises possibilita trabalhar com operações assíncronas de uma outra maneira.

						
function ler(arq) {
	return new Promise(function (resolve, reject) {
		fs.readFile(arq, function (err, conteudo) {
			if (err) {
				reject(err);
				return;
			}
			resolve(conteudo);
		});
	});
}

ler("teste.txt").then(function (conteudo) {
	console.log("PRO" + conteudo.toString());
}).catch(function (err) {
	console.log(err.message);
});
	
					

Eventos

O módulo 'events' possibilita nos criarmos nossos próprios eventos.

			
var EventEmitter = require("events").EventEmitter;

var objEmitter = new EventEmitter();

objEmitter.on("fezAlgo", function(a, b, c) {
	console.log(a+b+c);
});


// Emit
objEmitter.emit("fezAlgo", "aaa" , "bbb" , "ccc");
				
								

Streams

Com streams podemos manipular o fluxo de leitura/escrita de uma maneira mais performática.

			
var fs = require("fs");
var readableStream = fs.createReadStream("teste.txt");
var data = "";
readableStream.on("data", function(chunk) {
    data += chunk;
});
readableStream.on("end", function() {
    console.log(data);
});
				
	

Módulo http - WEB

Com node você que cria o seu próprio servidor, usando o módulo http

							
var http = require("http");
var server = http.createServer(function (req, res) {
	res.write(" oi ");
	res.end("FIM");
});
server.listen(8000, function () {
	console.log("servidor rodando na porta 8000");
});
							
							

Express

Express é framework WEB, que facilita o desenvolvimento web com node, ele lida com views, rotas, cookies, sessions, e outras coisas de servidores.

 
npm install -g express
npm install express
//===========================
var express = require("express");
var http = require("http");
var app = express();

http.createServer(app).listen(8000);

 
 

Express - Middleware

Middleware, são 'funções' pré-processam a requisição, por exemplo: parse de cookies, session, querystring, filtros etc...


function middlewareX(req, resp next) {

	next();
}

app.use(middlewareX);



Express - Views

O Express possibilita utilizar diversas engines de templates, devemos setar onde estão as views e qual engine iremos usar


app.set("view engine", "ejs");
app.set("views", "./views");


Express - Rotas

Para delegar as rotas usamos o verbo HTTP (get/post/put/delete), nos nomes dos métodos


app.get("/a", function (req, res, next) {
 res.render("index", { xxxx : "oi index" });
});

app.post("/a/:id", function (req, res, next) {
 res.render("exibir", { msg :  "oi"});
});


Acesso a Base de Dados

Há vários tipos de módulos que oferecem suporte a base de dados (MySql, MSSQL, Oracle, MongoDB, PostgreSQL entre outros).

Acesso a Base de Dados


var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '123456'
});

connection.connect();

connection.query('SELECT nome FROM  pesssoa ', function(err, rows, fields) {
  if (err) {throw err;}

  console.log('nome : ', rows[0].nome);
});

connection.end();

Aplicações REST

REST (REpresentational State Transfer) "Transferência de Estado Representacional", é uma arquitetura de software para criação de API. Utiliza os verbos HTTP.

  • GET
  • POST
  • PUT
  • DELETE
http://www.restapitutorial.com/httpstatuscodes.html

express-generator

Gera uma estrutura básica de um projeto express


 npm install express-generator -g

 express meu_app  --ejs

Comunicação em tempo real com WebSockets

WebSocket é um protocolo que permite comunicação bidirecional entre cliente/servidor web

WebSockets - eventos no Servidor

eventodescrição
connectionquando a conexão do cliente é estabelecida no servidor
messagequando servidor recebe um dado do cliente
errorquando ocorre erro na comunicação

WebSockets


var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({ port: 8080 });

wss.on('connection', function (ws) {

  ws.on('message', function (dados) {
    console.log("recebeu: " + dados);
  });
  ws.on('error', function () {

  });

  ws.send('oi  client');
});

		

WebSockets - eventos no cliente

eventodescrição
openocorre quando a conexão é estabelecida
messagequando cliente recebe um dado do servidor
errorquando ocorre erro na comunicação
closequando a conexão fecha

Chat básico em tempo real

...

FIM