introdução ao desenvolvimento web - dei.isep.ipp.ptproenca/dump/arqsi/arqsi1718 - node.pdf ·...
TRANSCRIPT
![Page 1: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/1.jpg)
Node.jsARQSI 2017/2018
![Page 2: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/2.jpg)
Node.js Desenvolvido por Ryan Dahl em 2009
Plataforma para desenvolvimento de aplicações servidoras utilizando JavaScript
Baseado naa Google’s V8 JavaScript Engine
Desenhado para situações de alta concorrência• Sem threads nem lançamento de novos processos
Última versão: 6.11.4
![Page 3: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/3.jpg)
MEAN, a full stack
MongoDB: base de dados NoSQL (não relacional)
Express: server-side web framework
Angular: framework de desenvolvimento de aplicações no cliente/browser
Node.js: plataforma de desenvolvimento no servidor
![Page 4: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/4.jpg)
O que é que o Node.js pode fazer? Node.js can generate dynamic page content
Node.js can create, open, read, write, delete, and close files on the server
Node.js can collect form data
Node.js can add, delete, modify data in your database
![Page 5: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/5.jpg)
Porquê utilizar Node.js? Operações de I/O sem bloqueios
Muitas bibliotecas (módulos)
Comunidade muito ativa (IRC, Mailing lists, Twitter, Github)
Suportado pelos principais sistemas operativos
Uma única linguagem para Frontend e Backend
![Page 6: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/6.jpg)
Porquê utilizar Node.js? “Node's goal is to provide na easy way to buildscalable network programs.”
![Page 7: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/7.jpg)
Casos de sucesso
![Page 8: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/8.jpg)
Node.js vs ASP/PHP – Processamento do pedido Node.js elimina a fase da espera continuando, simplesmente,
para a tarefa seguinte
ASP e PHP Node.js
1 Sends the task to the computer's file system. 1 Sends the task to the computer's file system.
2 Waits while the file system opens and reads the file. 2 Ready to handle the next request.
3 Returns the content to the client. 3 When the file system has opened and read the file, the server returns the content to the client
4 Ready to handle the next request
![Page 9: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/9.jpg)
Node.js Suporta concorrência através do conceito de eventos e callbacks
Utiliza funções assíncronas e o padrão observer
Existe uma única thread que mantem 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 10: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/10.jpg)
Tratamento de eventos Criar uma função callback que responde ao evento (criar o listener)
Registar a função callback no emissor do evento para um dado evento
Quando o emissor emite o evento a função callback é executada
var listener1 = function() {console.log('Execução da função listener 1.’);
}
on('evento1', listener1)//ouaddListener('evento1', listner1)
eventEmitter.emit('evento1');
![Page 11: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/11.jpg)
Exemplo
var eventos = require('events');var eventEmitter = new eventos.EventEmitter();
var listener1 = function() {console.log('Execução da função listener.');
}eventEmitter.on('evento1', listener1);eventEmitter.emit('evento1');
console.log("Fim do Programa.");
C:\> node exemplo.jsExecução da função listnerFim do Programa.C:\>
exemplo.js
![Page 12: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/12.jpg)
Node.js – orientado a eventos 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 13: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/13.jpg)
Node.js – orientado a eventos
![Page 14: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/14.jpg)
Node.js – orientado a eventos
Threads Asynchronous Event-driven
Lock application / request with listener-workers threads
Only one thread, which repeatedly fetches an event
Using incoming-request model Using queue and then processes it
multithreaded server might block the request which might involve multiple events
Manually saves state and then goes on to process the next event
Using context switching No contention and no context switches
Using multithreading environments where listener and workers threads are used frequently to take an incoming-request lock
Using asynchronous I/O facilities (callbacks, not poll/select or O_NONBLOCK) environments
![Page 15: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/15.jpg)
Processamento síncrono vs. assíncronoHere is how PHP or ASP handles a file request:
1. Sends the task to the computer's file system.
2. Waits while the file system opens and reads the file.
3. Returns the content to the client.
4. Ready to handle the next request.
Here is how Node.js handles a file request:
1. Sends the task to the computer's file system.
2. Ready to handle the next request.
3. When the file system has opened and read the file, the server returns the content to the client.
4. Node.js eliminates the waiting, and simply continues with the next request.
5. Node.js runs single-threaded, non-blocking, asynchronously programming, which is very memory efficient.
![Page 16: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/16.jpg)
Exemplo Sem tratamento de eventos
var http = require('http');
http.createServer(function(req,res) {res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });res.end('<h2> Olá mundo! </h2>');
}).listen(8080);
console.log('Servidor iniciado em localhost:8080');
![Page 17: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/17.jpg)
Exemplo Com tratamento de eventos
var http = require('http');
var server = http.createServer();
server.on('request', function(req,res) {res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });res.end('<h2> Olá mundo! </h2>');
});
server.listen(8080)console.log('Servidor iniciado em localhost:8080');
![Page 18: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/18.jpg)
Node.js – Não obstrutivo Todos os recursos e módulos disponibilizados para o Node.js
adotam um padrão não obstrutivo para a escrita do código.
Código estruturado para que as operações possam ser executadas de forma independente entre si
![Page 19: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/19.jpg)
Exemplo
var frase;
carregaFrase = function (callback) {setTimeout(function() {//Simula leitura da frase de uma base de dados.frase = "Minha frase obstrutiva";callback();
}, 3000)}
imprimeFrase = function () {console.log(frase);
}
carregaFrase(imprimeFrase);console.log("Olá");
C:\> node exemplo.jsOláMinha frase obstrutivaC:\>
exemplo.js
![Page 20: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/20.jpg)
NPM NPM – Node Package Manager
Repositório online de projetos em código livre para o Node.js (http://www.npmjs.com)
Utilitário de linha de comando que interage com o repositório online e permite a instalação, a gestão de versões e de dependências dos módulos
C:\ProjectFolder\>npm install uppercase
![Page 21: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/21.jpg)
Requisitos Node.js Download do Node.js em http://nodejs.org
Instalar Node.js
Instalar a framework Express
Download Visual Studio Code em https://code.visualstudio.com/
Instalar Visual Studio Code
C:\> npm install express --save
C:\> node –vV6.11.4
![Page 22: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/22.jpg)
Primeiro projeto Node.js Criar um diretório para o projeto
Executar Visual Studio Code e escolher Open folder …
Selecionar diretório criado para o projeto
C:\> mkdir ProjectFolder
![Page 23: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/23.jpg)
Primeiro projeto Node.js Ficheiro package.json• Criado na raiz do diretório do projeto
• Contem informações sobre o projetoo Nome
o Versão
o Dependências
o Licença
o Ficheiro main
o …
Pode ser gerado com o comando npm initC:\ProjectFolder\> npm init
![Page 24: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/24.jpg)
Primeiro projeto Node.js Exemplo de um ficheiro package.json
{ "name": "node-api", "main": "server.js", "dependencies": {
"body-parser": "~1.0.1", "express": "~4.0.0", "mongoose": "*", "mongoose-id-validator": "^0.4.3"
}}
package.json
![Page 25: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/25.jpg)
Primeiro projeto Node.js Com o package.json definido
Instalar módulos referenciados
Este comando cria diretório node_modules com as bibliotecas
C:\> cd ProjectFolderC:\ProjectFolder\> npm install --save
![Page 26: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/26.jpg)
Primeiro projeto Node.js Os módulos instalados são carregados pelo código recorrendo à
função require(<nome do módulo>)
Exemplo:
var uc = require('upper-case');console.log(uc("hello world!"));
Exemplo.jsC:\> node exemplo.jsHELLO WORLDC:\>
![Page 27: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/27.jpg)
Primeiro projeto Node.js Módulo HTTP
• Permite ao Node.js transferir informação com o protocolo HTTP
Servidor Web• O módulo HTTP permite criar um servidor Web (método createServer())
var http = require('http');
var http = require('http');
//create a server object:http.createServer(function (req, res) {res.write('Hello World!'); //write a response to the clientres.end(); //end the response
}).listen(8080); //the server object listens on port 8080
![Page 28: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/28.jpg)
Cabeçalho HTTP Para que o servidor HTTP envie Código HTML deve ser alterada a
propriedade content-type do cabeçalho HTTP
Para tal, utiliza-se o método writeHead(<status_code>,<header>)• O primeiro argumento é o Código HTTP 200
• O Segundo, é um objeto contendo o cabeçalho da resposta.
var http = require('http');
http.createServer(function (req, res) {res.writeHead(200, {'Content-Type': 'text/html'});res.write('Hello World!'); res.end();
}).listen(8080);
![Page 29: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/29.jpg)
Query String Argumento req• Objeto, do tipo http.IncomingMessage, que representa o pedido do cliente
• Este objeto possui a propriedade url que armazena a parcela do endereço que segue o nome do domínio.
var http = require('http');
http.createServer(function (req, res) {res.writeHead(200,
{'Content-Type': 'text/html'});res.write(req.url);res.end();
}).listen(8080);
![Page 30: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/30.jpg)
Query String Outro Exemplo
var http = require('http');var url = require('url’);
http.createServer(function (req, res) {res.writeHead(200,
{'Content-Type': 'text/html'});var qstring = url.parse(req.url, true).query; var txt = qstring.nome + " " + qstring.idade;res.end(txt);
}).listen(8080);
![Page 31: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/31.jpg)
Módulos relevantes Alguns módulos relevantes para o desenvolvimento de aplicações
Web em Node.js• express – framework para desenvolvimento de aplicações Web
• body-parser – middleware para tratamento de JSON e dados
• cookie-parser – processamento de cookies
• multer – middleware para multipart/form-data
![Page 32: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/32.jpg)
RESTFull API com ExpressARQSI 2017/2018
![Page 33: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/33.jpg)
Gerar estrutura da aplicação Web (scafolding)
https://expressjs.com/en/starter/generator.html
How to structure a Node.js Express project, by Sean McGary on Mar 27, 2016
C:\> cd folderWithProjectsC:\> npm install -g express-generatorC:\> express myAppName
![Page 34: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/34.jpg)
Criar uma RESTful API Criar o ficheiro server.js com o seguinte código:
var express = require('express');app = express();port = process.env.PORT || 8080;
app.listen(port);
console.log('RESTful API server started on: ' + port);
server.js
![Page 35: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/35.jpg)
OO, Database & ODM Model• As “classes” dos objetos de negócio/domínio
MongoDB• NoSQL, document-centered database
Mongoose• http://mongoosejs.com
• ODM: Objet/Document Mapper
• Biblioteca/framework de abstração de ligação a MongoDB
![Page 36: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/36.jpg)
Definição do Modelo Conexão à base de dados MongoDB
mongoose – modulo que permite a inteação com uma base de dados MongoDB. Disponibiliza funcionalidades de modelação da informação baseadas em esquemas e inclui processos para conversão de tipos de informação, validação e construção de inquéritos.
var mongoose = require('mongoose');mongoose.connect('mongodb:'mongodb://localhost/test', { useMongoClient: true });
![Page 37: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/37.jpg)
Definição do Modelo A modelação assenta em esquemas que definem a estrutura da
informaçãovar Schema = mongoose.Schema;
var blogSchema = new Schema({title: String,author: String,body: String,comments: [{ body: String, date: Date }],date: { type: Date, default: Date.now },hidden: Boolean,meta: {votes: Number,favs: Number
}});
![Page 38: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/38.jpg)
Definição do Modelo Os Schema Types são:• String
• Number
• Date
• Buffer
• Boolean
• Mixed
• ObjectId
• Array
var schema = new Schema({name: String,binary: Buffer,living: Boolean,updated: { type: Date, default: Date.now },age: { type: Number, min: 18, max: 65 },mixed: Schema.Types.Mixed,_someId: Schema.Types.ObjectId,ofString: [String],ofNumber: [Number], ofObjectId: [Schema.Types.ObjectId],ofArrays: [[]]ofArrayOfNumbers: [[Number]]nested: {stuff: { type: String, lowercase: true, trim: true }
}})
![Page 39: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/39.jpg)
Definição do Modelo O relacionamento entre esquemas é feito pelo element ObjectId
(…)var authorSchema = Schema({name : String,stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});(…)
(…)var storySchema = Schema({author : { type: Schema.Types.ObjectId, ref: 'Author' },title : String
});(…)
![Page 40: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/40.jpg)
Definição do Modelo A criação do modelo é responsabilidade do método model() do mongoose
var Blog = mongoose.model('Blog', blogSchema);
Model name
Schema
![Page 41: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/41.jpg)
Validações Todos os Schema Types possuem funcionalidades de validação de
campo obrigatório
O tipo Number possui validação de min e max
O tipo String possui:• enum – que permite especificar a lista de valores possiveis para o campo
• match – que permite definer uma expressão regular para validar o valor do campo
• maxlength e minlength – para definir a dimensão máxima e minima do texto
![Page 42: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/42.jpg)
Módulo mongoose-id-validator Plug-in que permite verificar se um documento que refere outro pelo
seu ID está a referenciar um documento que, de facto, existe.
Não garante coerência da informação• Não identifica situações de IDs válidos aquando da inserção e que foram
posteriormente removidos
• É necessário implementa lógica de validação para operações de DELETE
Instalação:
C:\> npm install mongoose-id-validator
![Page 43: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/43.jpg)
Módulo mongoose-id-validator Utilização:
var idvalidator = require('mongoose-id-validator’);
var ManufacturerSchema = new Schema({name : String
});var Manufacturer = mongoose.model('Manufacturer', ManufacturerSchema);
var CarSchema = new Schema({name : String,manufacturer : { type: Schema.Types.ObjectId, ref: 'Manufacturer’, required: true }
});CarSchema.plugin(idvalidator);var Car = mongoose.model('Car', CarSchema);
![Page 44: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/44.jpg)
Módulo mongoose-id-validator Utilização:
var ford = new ManufacturerSchema({ name : 'Ford' });
ford.save(function() {var focus = new Car({ name : 'Focus' });focus.manufacturer = "50136e40c78c4b9403000001";
focus.validate(function(err) {//err.errors would contain a validation error for manufacturer with default message
focus.manufacturer = ford;focus.validate(function(err) {//err will now be null as validation will pass
});});
});
![Page 45: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/45.jpg)
Definição do Modelo Esquema• documento vs. entidade/tabela
• desnormalização baseada em DDD vs. normalizaçãoo Aggregates + Parent-child vs. Chave estrangeira
Operações atómicas de escrita• Num documento e numa coleção
cf. https://docs.mongodb.com/v3.2/core/data-model-design/
![Page 46: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/46.jpg)
Exemplo do Modelovar mongoose = require("mongoose");var mongoose_validator = require("mongoose-id-validator");
var departamentoSchema = mongoose.Schema({Nome: String,Diretor: {type: mongoose.Schema.Types.ObjectId, ref: 'Pessoa'}, Alunos: [{
Aluno: {type: mongoose.Schema.Types.ObjectId, ref: 'Pessoa’},Notas: [{
UnidadeCurricular: {type: mongoose.Schema.Types.ObjectId, ref: 'UC'},Nota: Number,Data: Date
}]}],
});
receitaSchema.plugin(mongoose_validator);module.exports = mongoose.model('Departamento', departamentoSchema);
![Page 47: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/47.jpg)
Routeamento
cf. https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/mongoose
![Page 48: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/48.jpg)
Configuração do Roteamento A framework express fornece funcionalidades de roteamento
O método Router() permite instanciar e gerir essas funcionalidades
var router = express.Router();router.use(function(req, res, next) {
console.log('Something is happening.');next();
});
router.get('/', function(req, res) {res.json({ message: 'hooray! welcome to our api!' });
});
![Page 49: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/49.jpg)
Configuração do Roteamento A definição de novas rotas é feita pelo método Route()
Este objeto também permite definir os métodos HTTP associados aoroteamento
router.Route('/tasks').get(todoList.list_all_tasks).post(todoList.create_a_task);
router.Route('/tasks/:taskId').get(todoList.read_a_task).put(todoList.update_a_task).delete(todoList.delete_a_task);
Método de ação do controlador
![Page 50: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/50.jpg)
Cliente REST usando ‘node-rest-client’ - GET
outros métodos e mais detalhes em:https://www.npmjs.com/package/node-rest-client
![Page 51: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/51.jpg)
Autenticação e AutorizaçãoARQSI 2017/2018
![Page 52: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/52.jpg)
Introdução Autenticação: determina que o utilizador é quem diz ser
Autorização: determina quem (autenticado) tem acesso a quê
Since the HTTP protocol is stateless, this means that if we authenticate a user with a username and password, then on the next request, our application won't know who we are. We would have to authenticate again, and again, and again, ...
Session-based (server-based) authentication• Informação de autenticação é armazenada no servidor em sessões (em memória
ou com persistência)• Escalabilidade é afetada• E ainda Cross-Origin Resource Sharing - CORS e Cross-Site Request Forgery - CSRF
(cf. Administração de Sistemas)
![Page 53: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/53.jpg)
Token-based authentication1. User Requests Access with Username / Password
2. Application validates credentials
3. Application provides a signed token to the client
4. Client stores that token and sends it along with every request
5. Server verifies token and responds with data
cf. https://scotch.io/bar-talk/the-ins-and-outs-of-token-based-authentication
e em UML?
![Page 54: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/54.jpg)
JWT (JSON Web Tokens) A JSON Web Token has three parts:• the crypto information, the payload, and the signature.
On the server end the token is verified by re-encrypting the payload with the crypto info and checking to see if it matches the signature. Any change to the payload will negate the signature and invalidate the token.
The token is secure because the Salt is only known to the server so resigning a fake token is virtually impossible.
cf. https://scotch.io/tutorials/the-anatomy-of-a-json-web-token
![Page 55: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/55.jpg)
Como? Create and verify JWTs
Encrypt and decrypt password
Tutoriais:• https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens
• https://medium.freecodecamp.org/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52
• https://github.com/expressjs/express/blob/master/examples/route-middleware/index.js
• https://github.com/VinceZK/authorization
C:\> npm install jsonwebtoken --save
C:\> npm install bcryptjs --save
![Page 56: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/56.jpg)
Modelo User Definição da classe modelo user.js
var mongoose = require('mongoose');var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({name: String,password: String,email: String,isAdmin: Boolean})
);
user.js
![Page 57: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/57.jpg)
Definição das rotas para User Alterar server.js referenciando os novos roteamentos
Criar as novas rotas em UserRoutes.js
var express = require('express');var jwt = require('jsonwebtoken');var bcrypt = require('bcryptjs’);var UserModel = require('../models/user');var VerifyToken = require('../auth/VerifyToken’);
var router = express.Router();(…)
UserRoutes.js
server.js
(…)var UserRoutes = require('./app/routes/UserRoutes');app.use('/api/users',UserRoutes);(…)
![Page 58: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/58.jpg)
Definição das rotas para User - register Rota /api/users/register
(…)router.post('/register',function(req,res){
var user= new UserModel();user.name = req.body.name;user.password = bcrypt.hashSync(req.body.password,8);user.email = req.body.email;user.isAdmin = req.body.isAdmin; user.save(function (err){
if(err)return res.status(500).send("There is a problem registering the user.");
res.json({message:"User registered!"});})
});
UserRoutes.js
![Page 59: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/59.jpg)
Definição das rotas para User - register Rota /api/users/register
![Page 60: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/60.jpg)
Definição das rotas para User - login Rota /api/users/login
(…)router.post('/login',function (req,res){UserModel.findOne({email: req.body.email}, function(err,user){if (err) throw err;if(!user) {res.json({success:false,message:'Authentication failed.’});}else if(user){
if(!bcrypt.compareSync(req.body.password, user.password))return res.status(401).send({auth:false,token:null,message: 'Auth failed.'});
else {const payload= {user:user.email};var theToken = jwt.sign(payload, 'TheSecret_123456789', {expiresIn:86400});res.json({success:true,message:'Enjoy your token!',token:theToken});
}}
});});
UserRoutes.js
![Page 61: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/61.jpg)
Definição das rotas para User - login Rota /api/users/login
![Page 62: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/62.jpg)
Definição das rotas para User - / Rota /api/users/
(…)function hasRole(userEmail, role, func){
UserModel.findOne({email: userEmail}, function (err, user){if (err) throw err;
if(!user){res.json({success: false, message: 'Authentication failed.'});
} else if (user) {
func(role === 'administrator' && user.isAdmin === true)}
})}
UserRoutes.js
![Page 63: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/63.jpg)
Definição das rotas para User - / Rota /api/users/
(…)router.get('/', VerifyToken, function(req, res){
hasRole(req.user, 'administrator', function (decision) {if (!decision)
return res.status(403).send({auth:false,token: null,message: 'You have no authorization.'}
);else
UserModel.find(function (err, users){if (err) res.send(err);res.json(users);
})});
})module.exports = router;
UserRoutes.js
![Page 64: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/64.jpg)
Definição das rotas para User - / Rota /api/users/
![Page 65: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/65.jpg)
Middleware
var jwt = require('jsonwebtoken');
function verifyToken(req, res, next){var token = req.headers['x-access-token'];if (!token)
return res.status(403).send({auth:false,message:'No token provided.’});
jwt.verify(token, 'TheSecret_123456789', function(err, decoded){if (err)
return res.status(500).send({auth:false,message:'Failed to authenticate token.'});req.user = decoded.user;next();
}); }
module.exports = verifyToken;
VerifyToken.js
![Page 66: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/66.jpg)
Implantação no Azure com VS CodeARQSI 2017/2018
![Page 67: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/67.jpg)
Deploy a Node.js Application to Azure URL: https://code.visualstudio.com/tutorials/nodejs-deployment/getting-started
Instalar Microsoft CLI 2.0 for Azure• URL: https://aka.ms/InstallAzureCliWindows
Na consola:
Aceder a https://aka.ms/devicelogin e colocar o código obtido na consola
C:\> az loginTo sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXXXX to authenticate.
![Page 68: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/68.jpg)
Deploy a Node.js Application to Azure Iniciar sessão no azure com a conta pessoal.
É enviado um objeto JSON para a consola com a seguinte estrutura:[{"cloudName": "AzureCloud","id": "8oct2f12-8f0a-412e-99f3-e1405333bfb","isDefault": true,"name": "Microsoft Imagine","state": "Enabled","tenantId": "84d32234-9d44-407a-9d64-d0b21be94631","user": {"name": “[email protected]","type": "user"
}}
]
![Page 69: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/69.jpg)
Deploy a Node.js Application to Azure Criar o sítio Web no Azure• Criar Resource Group (só necessário na 1ª publicação)
“A "Resource Group" is essentially a named collection of all our application's resources in Azure. For example, a Resource Group can contain a reference to a website, a database, and an Azure function.”
• Configurar Resource Group para ser o grupo utilizado por omissão
• Criar um “App Service Plan” para definir os recursos físicos utilizados para a hospedagem (só necessário na 1ª publicação)
C:\> az group create --name myResourceGroup --location westus
Nome do grupo West US data centerhttps://azure.microsoft.com/pt-pt/regions/
C:\> az configure --defaults group=myResourceGroup location=westus
C:\> az appservice plan create --name myPlan --sku F1
Free hosting plan
![Page 70: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/70.jpg)
Deploy a Node.js Application to Azure Criar o sítio Web no Azure• O nome escolhido para o sitio Web terá de ser único uma vez que o acesso será
feito pelo endereço URL http://nome_escolhido.azurewebsites.net
• A criação será efetuado pelo comando:
C:\> az webapp create --name nome_escolhido --plan myPlan --runtime "node|6.10"
Tells Azure to use node version 6.10.x when
running this application
![Page 71: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/71.jpg)
Deploy a Node.js Application to Azure Deploy do sítio Web• Este processo recorre ao git e ao Azure CLI e implica um push do repositório
para o Azure.1. Criar um projeto com ficheiro .gitignore
2. Copiar o ficheiro .gitignore para a pasta do projeto
3. Executar na pasta do projeto
C:\> express --git
C:\Proj> git initC:\Proj> git add -AC:\Proj> git commit –m "Initial Commit"
![Page 72: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/72.jpg)
Deploy a Node.js Application to Azure Deploy do sítio Web
4. Criar um Remote (nome para designar o repositório remoto no Azure)
5. Fazer o deploy para Azure
6. Inserir as credenciais de deployment criadas em 4.
C:\Proj> az webapp deployment user set --user-name <user> --password <pass>C:\Proj> az webapp deployment source config-local-git --name <nome_escolhido>{"url": "https://<user>@<nome_escolhido>.scm.azurewebsites.net/<nome_escolhido>.git"
}
C:\Proj> git remote add azurehttps://<user>@<nome_escolhido>.scm.azurewebsites.net/<nome_escolhido>.git
C:\Proj> git push azure master
set up deploy credentials in Azure
Set up deploy credentials in Azure
![Page 73: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/73.jpg)
Deploy a Node.js Application to Azure Publicar alterações efetuadas no sítio Web• Com a consola
1. Efetuar commit para o repositório local
2. Publicar fazendo push para o Azure
• Com o VS Code1. Abrir o Source Control Manager (SCM) (Ctrl+Shift+G)
2. Especificar uma mensagem de commit e pressionar Ctrl+Enter ou selecionar Commit All no menu …
3. Para publicar selecionar a opção Publish Branch no menu …
4. Especificar azure no Remote para publicação
![Page 74: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/74.jpg)
MailARQSI 2017/2018
![Page 75: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/75.jpg)
SMTP2GO no Node.js Ir a https://www.smtp2go.com/ e
carregar no ‘Try SMTP2GO Free’ para efetuar o registo
Ir ao menu de ‘Settings’ e ao submenu ‘Users’ (painel esquerdo do site)
Nesta janela, dentro do circulo verde temos os dados de ligação ao servidor que serão usados no Node.js
![Page 76: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/76.jpg)
SMTP2GO no Node.js
Carregar na opção de ‘AddSMTP User’, para criar o utilizador de acesso ao servidor SMTP
![Page 77: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/77.jpg)
![Page 78: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/78.jpg)
![Page 79: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/79.jpg)
Testing NodeJSARQSI 2017/2018
![Page 80: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/80.jpg)
Testing Node.js application https://scotch.io/tutorials/test-a-node-restful-api-with-mocha-and-chai
![Page 81: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/81.jpg)
ImplantaçãoARQSI 2017/2018
![Page 82: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/82.jpg)
Implantação em Azure Criar conta em Azure: (email + doc de Fernando Mouta)
Tutorial: https://code.visualstudio.com/tutorials/nodejs-deployment/getting-started
![Page 83: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/83.jpg)
Implantação em Heroku
![Page 84: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/84.jpg)
Implantação em OpenShift
![Page 85: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/85.jpg)
Pros Very fluent, you don't have to worry about switching languages when writing code for the client and
server.
JSON, Your JS objects are JSON, if you are writing web APIs - it's JSON and here's the best part -MongoDB. MongoDB lets you store and retrieve JSON documents. This is a very important factor for me as I develop web APIs for my mobile apps.
JS - A dynamically typed language like JS gives you flexibility and has advantages over strongly typed language like Java in some situations. One such situation is writing apps for the Node.js platform.
It's fast - JS code is compiled to native code by Chrome's V8 runtime. I find a lot of misleading information on blogs and Youtube videos stating that Node.js is slow because it uses JavaScript. Don't fall for this misguided piece of information ;)
NPM - Node package manager makes installing Node modules a breeze.
Deployment - It's very very easy to deploy. Deploying Node.js apps on Heroku and Nodejitsu saves tons of developer time.
![Page 86: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/86.jpg)
Cons Callback Hell - Node.js relies heavily on callbacks and you might not be surprised writing
nested callbacks which are 5 or 6 levels deep. You could avoid this by using named functions or by using futures and promises.
Code structure and maintenance When you are building a large app. There the language itself should be able to enforce constraints over the API design as well as on other developers collaborating on the project. JavaScript as a language lacks this ability. A strongly typed language like Java will aid you in accomplishing this. Although I understand that this could partly be done using an MVC framework like Backbone.js. The language itself is lacking in this area.
Testability Java apps are easy to test, this may be due to the fact that I have more experience with testing frameworks in Java.Performance I wrote a couple of basic applications (each app written in express.js and Play 2) and used Apache Bench to load test them. Play outperformed in both the cases. (I did not cluster Node.js during testing so it wasn't using all available cores on my Mac. However Play framework is built on Akka and uses multiple cores when available). Since I was happy with Play's performance, I didn't run Node.js on cluster mode.
![Page 87: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/87.jpg)
Referências https://www.codementor.io/olatundegaruba/nodejs-restful-apis-in-10-minutes-q0sgsfhbd
https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4
https://openclassrooms.com/courses/ultra-fast-applications-using-node-js/creating-your-first-app-with-node-js
http://mongoosejs.com/index.html
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/mongoose
http://mongoosejs.com/docs/schematypes.html
![Page 88: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/88.jpg)
Bibliografiahttps://pt.slideshare.net/ApaichonPunopas/nodejs-for-beginner/11
https://www.w3schools.com/nodejs/default.asp
https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4
https://www.tutorialspoint.com/nodejs/index.htm, e em particular:
◦ https://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm
◦ https://www.tutorialspoint.com/nodejs/nodejs_restful_api.htm
https://openclassrooms.com/courses/ultra-fast-applications-using-node-js
◦ https://scotch.io/tutorials/test-a-node-restful-api-with-mocha-and-chai
◦ https://code.visualstudio.com/docs/nodejs/nodejs-tutorial
◦ https://code.visualstudio.com/docs/nodejs/nodejs-debugging
◦ https://code.visualstudio.com/tutorials/nodejs-deployment/getting-started
◦ https://scotch.io/bar-talk/the-ins-and-outs-of-token-based-authentication
◦ https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens
◦ …
![Page 89: Introdução ao desenvolvimento Web - dei.isep.ipp.ptproenca/dump/ARQSI/ARQSI1718 - Node.pdf · Porquê utilizar Node.js? Operações de I/O sem bloqueios Muitas bibliotecas (módulos)](https://reader037.vdocuments.net/reader037/viewer/2022100303/5c44d01f93f3c34c5f8091d8/html5/thumbnails/89.jpg)
Node.jsARQSI 2017/2018