http://nodebr.com/
imaster.com.br
Aplicacoes web real time com nodejs - Caio Ribeiro Pereira
Emerson Macedo Leite
Giovanni Bassi
Luciano Ramalho
Habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível.
A carga total que uma aplicação pode suportar.
A habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta. É a junção da capacidade e da performance.
A velocidade do carro.
O limite de velocidade e o número de pistas da estrada.
Quantos carros e pistas eu posso adicionar sem diminuir a velocidade do tráfego.
Imagine que cada requisição no server seja um processo.
Se tivermos um número muito grande de requisições simultâneas, a fila de processos chegará ao seu limite, obrigando o servidor a dropar as requisições exedentes.
O servidor está temporariamente indisponível.
O nodejs trabalha apenas com uma fila, porém, quando ele recebe uma requisição, ele dispara um processo e volta pra esperar por outra.
Desta forma, a aplicação não é bloqueada, podendo receber e processar outra requisição.
É possivel instanciar varios processos do nodejs em uma mesma porta, trabalhando de forma distribuída. O Ideal é este número ser relativo ao número de núcleos de CPU do servidor.
sudo apt-get install python g++ make checkinstall
mkdir ~/src && cd $_
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz && cd node-v*
./configure
checkinstall #(remove the "v" in front of the version number in the dialog)
sudo dpkg -i node_*
nodejs 0.6.x
sudo apt-get install nodejs
Versão mais recente
sudo apt-get update
sudo apt-get install python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
pacman -S nodejs
http://nodejs.org/download/
npm install nome_do_módulo (instala um módulo)
npm install -g nome_do_módulo (instala um módulo global.)
npm install nome_do_módulo --save (instala atualizando o package.json.)
npm list (lista todos os módulos do projeto.)
npm list -g (lista todos os módulos globais.)
npm remove nome_do_módulo (desinstala um módulo do projeto.)
npm remove -g nome_do_módulo (desinstala um módulo global.)
npm update nome_do_módulo (atualiza a versão do módulo.)
npm update -g nome_do_módulo (atualiza a versão do módulo global.)
npm -v (exibe a versão atual do npm.)
{
"name": "nome-do-módulo",
"description": "descrição do módulo",
"author": "Allan Esquina",
"version": "1.2.3",
"private": true,
"dependencies": {
"modulo-1": "1.0.0",
"modulo-2": "~1.0.0",
"modulo-3": ">=1.0.0"
},
"devDependencies": {
"modulo-4": "*"
}
}
Major release(1), Minor release (2) e Patch (3)
Versão par Estável
Versão ímpar Instável
{
...
"dependencies": {
"modulo-1": "1.0.0", (Pega a versão 1.0.0, é fixo)
"modulo-2": "~1.0.0",(Atualiza a nível de patch)
"modulo-3": ">=1.0.0" (Versão igual ou superior a 1.0.0)
},
"devDependencies": {
"modulo-4": "*" (Sempre a última versão)
}
}
Os prefixos determinam a localização do módulo.
require("http") Carrega um módulo incluido no núcleo do nodejs
require("/nome-do-arquivo") carrega um arquivo colocando a extensão
(.js|.json|.node) no path absoluto do sistema de arquivo
require("./nome-do-arquivo") carrega um arquivo no path relativo ao módulo
que chamou o require
Quando o arquivo não é prefixado e não é nativo do Node core modules, o Node busca o módulo na pasta node_module.
require("modulo");
/home/nodeapps/project/node_modules/modulo.js
/home/nodeapps/node_modules/modulo.js
/home/node_modules/modulo.js
/node_modules/modulo.js
exports.soma = function (a,b) {
var resultado = a + b;
console.log(resultado);
};
exports.sub = function (a,b) {
var resultado = a - b;
console.log(resultado);
};
var obj = require("./operacoes");
obj.soma(1,9); // 10
obj.sub(1,9); // -8
Os módulos são salvos em cache no seu primeiro carregamento, logo, todas as chamadas retornarão o mesmo módulo.
O nome do arquivo do código que está sendo executado
O nome do diretório que está salvo o script que está sendo executado
Um objeto que é associado ao presente processo em execução. Além de variáveis, este objeto tem métodos como process.exit, process.cwd e process.uptime
Está acessível em qualquer parte da aplicação.
global.usuario = "Allan";
console.log(global.usuario);
server1.js
var http = require('http'),
server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type": "text/html"});
response.write("Hello World!
");
response.end();
});
server.listen(3000, function() {
console.log("start server on port 3000");
});
var http = require('http'),
port = 3000;
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type": "text/html"});
if(request.url == "/"){
response.write("Index
");
}else if(request.url == "/user"){
response.write("User
");
}else{
response.write("Not found!
");
}
response.end();
});
server.listen(port, function(){
console.log('start server on port ' + port);
});
var fs = require('fs');
...
fs.readFile(__dirname + '/index.html', function(err, data){
...
});
...
var http = require('http'),
fs = require('fs'),
port = 3000,
server = http.createServer(function(request, response){
fs.exists(__dirname + request.url, function(exists) {
if(exists) {
fs.readFile(__dirname + request.url, function(err, html){
response.writeHeader(200, {'Content-Type': 'text/html'});
response.write(html);
response.end();
});
} else {
response.writeHeader(200, {'Content-Type': 'text/html'});
response.end("404
");
}
});
});
server.listen(port, function(){
console.log('start server on port ' + port);
});
Semelhante ao Sinatra da linguagem Ruby
MVC (Model-View-Controller);
Roteamento de urls via callbacks
Middleware
Interface RESTFul
Suporte a File Uploads
Configuração baseado em variáveis de ambiente
Suporte a helpers dinâmicos
Integração com Template Engines
Integração com SQL e NoSQL
CLI (Command Line Interface)
npm install -g express
express project-name --ejs
cd project-name
npm install
public: pasta pública que armazena conteúdo estático.
routes: diretório que mantém todas as rotas da aplicação.
views: diretório que contém todas as views que são renderizadas pelas rotas.
Retorna um objeto contendo todas as funcionalidades do framework
app.get()
app.post()
app.put()
app.del()
string referente a uma rota
função callback
app.get('/contatos', function(request, response) {
console.log(...);
});
app.get('/', routes.index);
A chamada routes.index busca o arquivo index.js que contenha a função exports.index
Trás um objeto com chave e valor dos dados enviados.
Biblioteca para trabalhar com logs
Permite utilizar o mesmo path entre métodos HTTP
app.get('/contatos', contatos.index);
app.get('/contato/:id', contatos.show);
app.post('/contato', contatos.create);
app.get('/contato/:id/editar', contatos.edit);
app.put('/contato/:id', contatos.update);
app.del('/contato/:id', contatos.destroy);
Define um diretório para servir arquivos estáticos.
app.use(express.cookieParser());
app.use(express.session({secret: '1234567890NOFREAKZ'}));
exports.index = function(req, res){
req.session.nome = "Allan";
res.render('index', { title: 'Express' });
};
exports.list = function(req, res){
res.send("respond with a resource " + req.session.nome);
};
Embedded JS
app.set('view engine', 'ejs');
exports.index = function(req, res){
res.render('index', { title: 'Remote Control' });
};
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
</html>
npm install supervisor -g
supervisor program.js
npm install -g node-inspector
node --debug your/node/program.js
node-inspector &
WebSocket
Adobe® Flash® Socket
AJAX long polling
AJAX multipart streaming
Forever Iframe
JSONP Polling
Internet Explorer 5.5+
Safari 3+
Google Chrome 4+
Firefox 3+
Opera 10.61+
iPhone Safari
iPad Safari
Android WebKit
WebOs WebKit
npm install socket.io
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(80);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);
server.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
Espera uma conexão com um cliente, retorna um objeto socket do cliente conectado
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
io.sockets.emit("event", data);
Nodeunit
Mocha
qUnit
Expresso
nitrous.io
c9.io
jsapp.us
nodejitsu.com
heroku.com
nodecloud.org