• Nenhum resultado encontrado

Node.js ARQSI 2017/2018

N/A
N/A
Protected

Academic year: 2021

Share "Node.js ARQSI 2017/2018"

Copied!
89
0
0

Texto

(1)

Node.js

(2)

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

(3)

MEAN, a full stack

M

ongoDB

: base de dados NoSQL (não relacional)

E

xpress

: server-side web framework

A

ngular

: framework de desenvolvimento de aplicações no

cliente/browser

(4)

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

(5)

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

(6)

Porquê utilizar Node.js?

“Node's goal is to provide na easy way to build

(7)
(8)

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

(9)

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

(10)

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)

//ou

addListener('evento1', listner1)

(11)

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.js

Execução da função listner

Fim do Programa.

C:\>

(12)

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.

(13)
(14)

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

(15)

Processamento síncrono vs. assíncrono

Here 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.

(16)

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);

(17)

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)

(18)

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

(19)

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.js

Olá

Minha frase obstrutiva

C:\>

(20)

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

(21)

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 –v

(22)

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

(23)

Primeiro projeto Node.js

Ficheiro package.json

Criado na raiz do diretório do projeto

Contem informações sobre o projeto

o

Nome

o

Versão

o

Dependências

o

Licença

o

Ficheiro main

o

Pode ser gerado com o comando npm init

(24)

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

(25)

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 ProjectFolder

(26)

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.js

C:\> node exemplo.js

HELLO WORLD

(27)

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 client

res.end(); //end the response

(28)

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);

(29)

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);

(30)

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);

(31)

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

(32)

RESTFull API com

Express

(33)

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 folderWithProjects

C:\> npm install -g express-generator

C:\> express myAppName

(34)

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);

(35)

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

(36)

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');

(37)

Definição do Modelo

A modelação assenta em esquemas que definem a estrutura da

informação

var 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 } });

(38)

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 } }

(39)

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

}); (…)

(40)

Definição do Modelo

A criação do modelo é responsabilidade do método

model()

do

mongoose

var Blog = mongoose.model('Blog', blogSchema);

Model name

(41)

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

(42)

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:

(43)

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);

(44)

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

}); }); });

(45)

Definição do Modelo

Esquema

documento

vs.

entidade/tabela

desnormalização baseada em DDD

vs.

normalização

o

Aggregates + Parent-child vs. Chave estrangeira

Operações

atómicas

de escrita

Num documento e numa coleção

(46)

Exemplo do Modelo

var 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);

(47)

Routeamento

(48)

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!' }); });

(49)

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 ao

roteamento

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);

(50)

Cliente REST usando ‘node-rest-client’ - GET

outros métodos e mais detalhes em:

(51)

Autenticação e

Autorização

(52)

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)

(53)

Token-based authentication

1.

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

(54)

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.

(55)

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

(56)

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

(57)

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);

(58)

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!"});

}) });

(59)

Definição das rotas para User - register

(60)

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});

} } }); });

(61)

Definição das rotas para User - login

(62)

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) }

}) }

(63)

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

(64)

Definição das rotas para User - /

(65)

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

(66)

Implantação no

Azure com VS Code

(67)

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 login

To sign in, use a web browser to open the page https://aka.ms/devicelogin and

enter the code

XXXXXXXXX

to authenticate.

(68)

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": “eu@gmail.com", "type": "user" } } ]

(69)

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 center

https://azure.microsoft.com/pt-pt/regions/

C:\> az configure --defaults group=myResourceGroup location=westus

C:\> az appservice plan create --name myPlan --sku F1

(70)

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

(71)

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 init

C:\Proj> git add -A

(72)

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 azure

https://<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

(73)

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 Code

1.

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

(74)

Mail

(75)

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

(76)

SMTP2GO no Node.js

Carregar na opção de ‘Add

SMTP User’, para criar o

utilizador de acesso ao

servidor SMTP

(77)
(78)
(79)

Testing NodeJS

(80)

Testing Node.js application

https://scotch.io/tutorials/test-a-node-restful-api-with-mocha-and-chai

(81)

Implantação

(82)

Implantação em Azure

Criar conta em Azure: (email + doc de Fernando Mouta)

Tutorial:

https://code.visualstudio.com/tutorials/nodejs-deployment/getting-started

(83)
(84)
(85)

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.

(86)

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.

(87)

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

(88)

Bibliografia

https://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 ◦ …

(89)

Node.js

Referências

Documentos relacionados

The results showed that the higher effi ciency in light energy uptake, paired with better photochemical performance and better CO 2 fi xation in plants under direct sunlight

Winning the 1932 Rio Branco Cup proved to be a landmark in the history and self-esteem of Brazilian football, as well as a watershed in the career of Leônidas, quickly identified

For example, studies in the field of behavioral corporate finance emphasize the cognitive processes and biases of the individual decision maker, but pay little attention to how

Further, it is needed to better develop our understanding of how information on the leaf, canopy, ecosystem and globe might be used together in scaling exercises to generate

As conclusion, Social Kitchen joins quality with social mission for that the client has a higher willingness to pay than other products and further captures

In ragione di queste evidenze, il BIM - come richiesto dalla disciplina comunitaria - consente di rispondere in maniera assolutamente adeguata alla necessità di innovazione dell’intera

Do amor,&#34; mas do amor vago de poeta, Como um beijo invizivel que fluctua.... Ella

The probability of attending school four our group of interest in this region increased by 6.5 percentage points after the expansion of the Bolsa Família program in 2007 and

Nesta abordagem, que se restringe à tradução de textos gregos para a língua portuguesa, considera-se o dicionário sob dois aspectos: (I) sendo ele um guia de uso — e de