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
w3schools – JavaScipt Tutorial – JavaScript Objects – JavaScript Functions
https://www.w3schools.com/js/default.asp
w3schools – Node.js Tutorial - Node.js MongoDB
https://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 Code
https://code.visualstudio.com/docs/nodejs/nodejs-tutorial
Build a RESTful API Using Node and Express 4
https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4
Easy Node Authentication: Setup and Local
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 mainSync Tutorials Point
Program Ended
Ficheiro input.txt:
Ficheiro mainSync.js: Ficheiro mainAsync.js:
Node.js> node mainAsync Program Ended
• 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:
Padrão observer
Node.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.
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.
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
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
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.
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,
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:
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);