Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do...

14
Node.js Download http://nodejs.org/en > node –v v8.7.0 > npm –v 5.4.2 Node.js é um ambiente de desenvolvimento (paltaforma) do lado do servidor, de código aberto, multi-plataforma, que corre JavaScript. Visual Studio Code version 1.17

Transcript of Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do...

Page 1: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Node.js• Download http://nodejs.org/en> node –v

v8.7.0

> npm –v

5.4.2

Node.js é um ambiente de desenvolvimento (paltaforma) do lado do servidor, de código aberto, multi-plataforma, que corre JavaScript.

Visual Studio Codeversion 1.17

Page 2: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

w3schools – JavaScipt Tutorial – JavaScript Objects – JavaScript Functionshttps://www.w3schools.com/js/default.asp

w3schools – Node.js Tutorial - Node.js MongoDBhttps://www.w3schools.com/nodejs/default.asp

tutorialspoint – Node.js Tutorial(PDF Version – 140 páginas: Web Module [99-103], Express Framework [104-125], RESTfull API [126-132])https://www.tutorialspoint.com/nodejs/

Ultra fast applications using Node.js https://openclassrooms.com/courses/ultra-fast-applications-using-node-js/installing-node-js

Node.js Tutorial in VS Codehttps://code.visualstudio.com/docs/nodejs/nodejs-tutorial

Build a RESTful API Using Node and Express 4https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4

Easy Node Authentication: Setup and Localhttps://scotch.io/tutorials/easy-node-authentication-setup-and-local

Page 3: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Funcionamento assíncrono (código não bloqueante)

Uma função callback é chamada quando uma dada tarefa termina

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());

console.log("Program Ended");

var fs = require("fs");

fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString());

});console.log("Program Ended");

Exemplo de código bloqueante: Exemplo de código não bloqueante:

Tutorials Point

Node.js> node mainSyncTutorials PointProgram Ended

Ficheiro input.txt:

Ficheiro mainSync.js: Ficheiro mainAsync.js:

Node.js> node mainAsyncProgram EndedTutorials Point

Page 4: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

• A função function(err, data) é uma função anónima e enviada como último argumento da função readFile().

• A função readFile() é uma função assíncrona, inicia a leitura e retorna.

• Em seguida o programa executa a instrução console.log(“Program Ended”).

• A função readFile() emite um evento “fim de leitura” quanto termina a leitura.

• A função callback function(err, data) só é invocada quando ocorre o evento “fim de leitura”.

• Deste modo o programa não executa as tarefas na ordem em que estão escritas.

var fs = require("fs");

fs.readFile('input.txt’,function (err, data) {

if (err) return console.error(err); console.log(data.toString());

});console.log("Program Ended");

Funcionamento assíncrono (código não bloqueante)

var fs = require("fs");var callback = function (err, data) {

if (err) return console.error(err); console.log(data.toString());

}fs.readFile('input.txt’, callback);console.log("Program Ended");

Código equivalente:

Page 5: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Padrão observerNode.js é uma aplicação com um único thread, mas suporta concorrência através do conceito de eventos e callbacks.

Para manter a concorrência Node.js usa funções assíncronas e o padrão observer.

A thread Node mantém um ciclo de eventos e sempre que uma tarefa termina, dispara o evento correspondente que sinaliza a execução da função listener do evento.

Page 6: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

var eventos = require('events'); // Importa o módulo events

var eventEmitter = new eventos.EventEmitter(); // Cria um objeto eventEmitter

var listener1 = function() { // Cria um listener

console.log('Execução da função listener.');

}

eventEmitter.on('evento1', listener1); // Liga evento1 com o listener

eventEmitter.emit('evento1'); // Dispara o evento evento1

console.log("Fim do Programa.");

// Output:

> node evento

Execução da função listener.

Fim do Programa.

Ficheiro evento.js

Page 7: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Tratamento de eventos

1- Criar uma função callback com o código a ser executado quando ocorrer o evento (criar o listener)

var listener1 = function() {

console.log('Execução da função listener 1.’);

}

2- Registar a função callback no emissor do evento para um dado evento (adicionar um listener no fim do array de listeners para o evento específico)

on(event, listener1) ou addListener(event, listner1)

3- Quando o emissor emite o evento a função callback é executada

eventEmitter.emit('evento1');

Page 8: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Numa aplicação Node:

• Qualquer função assíncrona aceita uma função callback como último parâmetro

• Uma função callback aceita um objeto error como primeiro parâmetro

var fs = require("fs");

fs.readFile('input.txt’,function (err, data) {

if (err) return console.error(err);console.log(data.toString());

});console.log("Program Ended");

• fs.readFile() é uma função assíncrona que lê o conteúdo de um ficheiro.

• Se durante a leitura ocorrer um erro, a leitura termina e um objeto erro é passado à função callback.

• Se durante a leitura não ocorre erro, quando a operação de leitura termina um objeto data contendo o conteúdo da leitura é passado à função callback

Page 9: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Uma aplicação servidora Node.js corre num único thread.

Embora só possa realizar uma tarefa de cada vez, Node.js é muito eficiente a tratar muitos pedidos simultaneamente, devido à sua natureza orientada a eventos.

• Se no processamento de um pedido inicia a realização de uma operação mais demorada, o programa retorna e passa para o próximo pedido.

• Quando a operação mais demorada termina, lança um evento e Node.js continua a processar esse pedido.

Page 10: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas
Page 11: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

var http = require('http');

http.createServer(function (req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Hello World!');

}).listen(8080);

Ficheiro server.js:

O módulo http é carregado e retorna um objeto JavaScript (http), que permite executar as funcionalidades disponíveis no módulo.

A função createServer() executa um programa servidor que escuta no porto 8080.

A função callback anónima function(req, res) é invocada sempre que um pedido é recebido pelo servidor. Contém 2 parâmetros:

• O primeiro, “req”, é um objeto que contém toda a informação do pedido,

• O segundo, “res”, é um objeto que devemos preencher com a resposta a enviar.

Page 12: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

var http = require('http');

var url = require('url');

var fs = require('fs');

http.createServer(function (req, res) {

var q = url.parse(req.url, true);

var filename = "." + q.pathname;

fs.readFile(filename, function(err, data) {

if (err) {

res.writeHead(404, {'Content-Type': 'text/html'});

return res.end("404 Not Found");

}

res.writeHead(200, {'Content-Type': 'text/html'});

res.write(data);

return res.end();

});

}).listen(8080);

<!DOCTYPE html><html><body><h2>Inverno</h2></body></html>

<!DOCTYPE html><html><body><h2>Verão</h2></body></html>

Ficheiro server.js:

Ficheiro verao.html: Ficheiro inverno.html:

Page 13: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

var http = require('http');

var url = require('url');

var querystring = require('querystring');

http.createServer(function (req, res) {

var q = url.parse(req.url, true);

console.log("href=" + q.href);

console.log("pathname=" + q.pathname);

console.log("search=" + q.search);

var querystringObject = q.query;

for (param in querystringObject) {

console.log("param["+param+"]=" + querystringObject[param]);

}

res.writeHead(200, {'Content-Type': 'text/plain'});

res.write(q.href);

return res.end();

}).listen(8080);

Ficheiro server.js:

Page 14: Apresentação do PowerPointmouta/ARQSI-2017-2018-1Sem/node.pdf · concorrência através do conceito de eventos e callbacks. Para manter a concorrência Node.js usa funções assíncronas

Express

Express é um framework Node.js para aplicações web

Node.js > npm install express –save // Node.js > express --version => 4.15.5

Node.js > npm install body-parser –save // midleware para tratar JSON e dados

Node.js > npm install cookie-parser –save // para tratar cookies

Node.js > npm install multer --save // midleware para multipart/form-data

Por omissão instala no diretório corrente (locally) – em ./node_modules

Para poder usar no próprio programa com require(‘modulo1’) devemos instalar na raiz do projeto (locally)

Com o parâmetro –g instala globalmente (globally) – em …/AppData/Roaming/npm