Está en la página 1de 42

Introducción a Node.

js
Grupo de usuarios Drupal Alicante + @tucamon

07/11/2012

Alessandro Mascherpa
@AlessMascherpa
Introducción a NodeJS @tucamon, 07Nov2012

Personal
● Desarrollador web freelance
http://es.linkedin.com/in/alessmascherpa
● Miembro de la Asociación
Española de Drupal,
http://asociaciondrupal.es/
http://drupal.org/user/395031
● Miembro de la Drupal Association,
https://association.drupal.org/
● Grupo de usuarios de Drupal de
Castellón: @DrupalCS,
http://groups.drupal.org/castellon

Alessandro Mascherpa, @AlessMascherpa 2 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 3 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 4 / 42
Introducción a NodeJS @tucamon, 07Nov2012

¿Qué es Node.js?
● Single threaded, event-
loop, non-blocking I/O
● Centrado en la
eficiencia
● SSJS: Server-Side
JavaScript. Google V8.
JavaScript es funcional
y event-driven Ref: http://nodejs.org/
● Super “cool”

Alessandro Mascherpa, @AlessMascherpa 5 / 42


Introducción a NodeJS @tucamon, 07Nov2012

¿Qué NO es Node.js?
● No es un fullstack
Web-framework
● No es un servidor
web (ni de otro tipo)
● No es web en tiempo
real
● Pero se puede construir cualquiera de los
anteriores con él

Alessandro Mascherpa, @AlessMascherpa 6 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 7 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Ref:
http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/
Alessandro Mascherpa, @AlessMascherpa 8 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Blocking

Ref:
http://magnetik.github.com/node-webid-report/
Alessandro Mascherpa, @AlessMascherpa 9 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Blocking

<?php
<?php
result
result == query("select...");
query("select...");
//
// esperar
esperar yy usar
usar result
result
?>
?>

Ref:
http://magnetik.github.com/node-webid-report/
Alessandro Mascherpa, @AlessMascherpa 10 / 42
Introducción a NodeJS @tucamon, 07Nov2012

NonBlocking

Ref: http://magnetik.github.com/node-webid-report/
http://www.aaronstannard.com/post/2011/12/14/Intro-to-NodeJS-for-NET-De
Alessandro Mascherpa, @AlessMascherpa 11 / 42
Introducción a NodeJS @tucamon, 07Nov2012

NonBlocking

query("select...",
query("select...", function
function (result)
(result) {{
//
// usa
usa result
result
});
});
//haz
//haz otra
otra cosa
cosa

Ref:
http://magnetik.github.com/node-webid-report/
Alessandro Mascherpa, @AlessMascherpa 12 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Blocking vs NonBlocking

Memoria Event-Loop
T0
T1
T2
T3
T4 Memoria
T5 PH0
PH1
PH2
PH3
PH4
PH5
Recursos
compartidos
Modelo Apache

Alessandro Mascherpa, @AlessMascherpa 13 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Blocking vs NonBlocking

Alessandro Mascherpa, @AlessMascherpa 14 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Blocking vs NonBlocking

Alessandro Mascherpa, @AlessMascherpa 15 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 16 / 42
Introducción a NodeJS @tucamon, 07Nov2012

La API de Node.js: extendiendo JS


● Procesos
● Filesystem
● Networking
● Utilidades
http://nodejs.org/api/

Ref: http://blog.zenika.com/index.php?post/2011/04/10/NodeJS

Alessandro Mascherpa, @AlessMascherpa 17 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Node.js Hello World: Simple Servidor HTTP

var http = require('http');

http.createServer(function (req, res) {


res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");

console.log('Server running http://127.0.0.1:1337/');

Alessandro Mascherpa, @AlessMascherpa 18 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 19 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Node Package Manager: npm


● Gestiona la instalación,
$ npm list
actualización, etc. de
módulos Node.js connect@1.7.0
● Node.js permite la qs@0.3.1
coexistencia de mime@1.2.3
diferentes versiones de express@1.0.7
un módulo en el sistema. connect@1.7.0
● Parece que NPM estará qs@0.3.1
integrada en futuras mime@1.2.2
versiones de Node.js. qs@0.3.1
Ref: http://npmjs.org/
Alessandro Mascherpa, @AlessMascherpa 20 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Connect y Express.js
● Connect es un HTTP server framework creado por
Sencha: https://github.com/senchalabs/connect#readme
● Express.js es un sencillo web-framework inspirado en
Sinatra y basado en Connect: http://expressjs.com/

var app = require('express').createServer();


app.get('/', function(req, res){
res.send('hello world');
});
app.listen(3000);

Alessandro Mascherpa, @AlessMascherpa 21 / 42


Introducción a NodeJS @tucamon, 07Nov2012
var express = require('express');
var app = express.createServer(express.logger());
app.register('.html', require('ejs'));
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.configure(function(){
app.use(app.router);
app.use(express.static(__dirname + '/filez'));
});
app.get('/', function(req, res) {
res.render('home.html', { title: "Math Wizard" });
});
app.get('/404', function(req, res) {
res.send('NOT FOUND '+req.url);
});
app.listen(8124);
console.log('listening to http://localhost:8124');

Alessandro Mascherpa, @AlessMascherpa 22 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Otros módulos destacados


● Underscore
● CoffeScript
● Socket.io, Now.js...
● Mustache.js, Jade...
● Cluster (parte de core desde 0.6.x)
● Expresso, Jasmine, Cucumber.js, Mocha, Zombi...
● Mongoose, Node-mysql, Node-sqlite3...
Refs: http://search.npmjs.org/
https://github.com/joyent/node/wiki/modules

Alessandro Mascherpa, @AlessMascherpa 23 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 24 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Críticas vs Visionarios
● Que si el código es ● Hay voces (o más bien
ilegible e inmantenible.. rumores) que piden que
desaparezca PHP por
● Que si tenemos que
que ya no hace falta.
volver a la edad de
Node.js + JavaScript es
piedra de internet y
mucho mejor y mucho
programar el servidor
más elegante...
para cada webapp que
hagamos...

● … cada herramienta tiene su ámbito de


aplicación donde destaca. Suerte que
tenemos opciones.
Alessandro Mascherpa, @AlessMascherpa 25 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Problemas con Node.js


● Procesos largos de cálculo. Soluciones:
● Refactorizar el algoritmo:

– process.nextTick(callback(){ … });

● Crear un servicio de backend y desviar el cálculo.

● Matriosca-style-coding, Boomerang-shape-code
o Callback-hell
Alessandro Mascherpa, @AlessMascherpa 26 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Callback Hell
database.find('foo', function (err, data) {
database.update('foo', 'bar', function (err, data) {
database.delete('bar', function (err, data) {
console.log(data);
});
});
});

Alessandro Mascherpa, @AlessMascherpa 27 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Solucionando el CallBack Hell


● Código orientado a var onDelete = function (err,
eventos y funciones data) {console.log(data);},
con nombre en lugar onUpdate = function (err, data)
de funciones {database.delete('bar',
anónimas onDelete);},
● Usando módulos que onFind = function (err, data)
abstraigan la {database.update('foo', 'bar',
onUpdate);};
serialización y
concurrencia de la database.find('foo', onFind);
ejecución de callbacks

Ref: http://stackoverflow.com/questions/5366424/writing-blocking-code-in-nodejs
http://stackoverflow.com/questions/5265743/node-js-what-techniques-are-there-for-w
Alessandro Mascherpa, @AlessMascherpa 28 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 29 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Casos de uso de Node.js en la web


● Comunicaciones
● Streaming
● Colaboración
● Juegos online
● Monitorización
… en definitiva aplicaciones de red tiempo real,
pero también...
● Servidores web eficientes
● Aplicaciones de escritorio y de consola
Alessandro Mascherpa, @AlessMascherpa 30 / 42
Introducción a NodeJS @tucamon, 07Nov2012

¿Qué tiene que ver Node.js con Drupal?


● Drupal es una gran plataforma de desarrollo
web.
● Pero Drupal es pesado a nivel de proceso y
recursos.
● Drupal se integra con Node.js para evitar esos
handicaps con aplicaciones que requieran
tiempo real.

Alessandro Mascherpa, @AlessMascherpa 31 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Casos de uso Node.js en Drupal


● Node.js Integration by beejeebus (Justin
Randell): Drupal gestiona los datos y Node.js
las comunicaciones entre clientes.
http://drupal.org/project/nodejs
http://2011.badcamp.net/program/sessions/drupal-and-nodejs
● Nodepal by synodinos (Dionysios G.
Synodinos): aplicación Node.js con acceso de
lectura a la base de datos Drupal (sin pasar por
Drupal) https://github.com/synodinos/nodepal
● Tareas repetitivas y frequentes:
http://fourkitchens.com/blog/2012/02/07/nodejs-drupal
Alessandro Mascherpa, @AlessMascherpa 32 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Demo
1.Instalar NodeJS (que ya incluye npm)
2.Instalar Drupal
3.Instalar nodejs module
4.Instalar drupalchat module (que usaremos como
ejemplo) http://drupal.org/project/drupalchat
5.Instalar dependencias de nodejs module (si se diese el
caso tambien tendríamos que instalar las de nuestro
módulo)

Ref: http://drupal.org/node/1713530

Alessandro Mascherpa, @AlessMascherpa 33 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Demo 2
6.Copiar nodejs.config.js y
drupalchat_nodejs.server.extension.js de drupalchat a
nodejs, para que esté en el mismo directorio que
server.js
7.Añadir a nodejs.config.js datos de nuestro sistema

Alessandro Mascherpa, @AlessMascherpa 34 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Demo 3: Config
path_to_modules/nodejs/nodejs.config.js
settings = {
scheme: 'http', port: 8080, host: 'localhost',
resource: '/socket.io', serviceKey: '',
backend: {
Port: 8082, host: 'nodejs.localhost',
scheme: 'http', basePath: '',
messagePath: '/nodejs/message'
},
debug: true,
extensions: ['drupalchat_nodejs.server.extension.js'],
transports: ['websocket', … ]
};
Alessandro Mascherpa, @AlessMascherpa 35 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Demo 4: Extension
path_to_modules/nodejs/drupalchat_nodejs.server.extension.js
49 .on('client-disconnect', function (sessionId) {
50 for (var user in drupalchat_users) {
51 if(drupalchat_users[user] == sessionId) {
52 ruser = user;
53 break;
54 }
55 }
56 console.log('Out - ' + ruser);
57 delete drupalchat_users[ruser];
58 if(ruser!=0) {
59 for (var user in drupalchat_users) {
60 if(drupalchat_users[user] != sessionId)‹
61 publishMessageToClient(drupalchat_users[user], {type: 'userOffline',
data: ruser, callback: 'drupalchatNodejsMessageHandler'});
62 }
63 }
64 });
Alessandro Mascherpa, @AlessMascherpa 36 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Demo 5: Event emit


path_to_modules/nodejs/server.js

1100 socket.on('disconnect', function () {


1101 process.emit('client-disconnect', socket.id);
1102 cleanupSocket(socket);
1103 });

Alessandro Mascherpa, @AlessMascherpa 37 / 42


Introducción a NodeJS @tucamon, 07Nov2012

Demo 6: NodeJS module API


path_to_modules/nodejs/server.js
391 /**
392 * Publish a message to a specific client.
393 */
394 var publishMessageToClient = function (sessionId, message) {
395 if (io.sockets.sockets[sessionId]) {
396 io.sockets.socket(sessionId).json.send(message);
397 if (settings.debug) {
398 console.log('Sent message to client ' + sessionId);
399 }
400 return true;
401 }
402 else {
403 console.log('publishMessageToClient: Failed to find client ' + sessionId);
404 }
405 };
Alessandro Mascherpa, @AlessMascherpa 38 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Intro
Arquitectura
API
NPM y módulos destacados
Críticas y problemas
Casos de uso
Referencias
Alessandro Mascherpa, @AlessMascherpa 39 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Referencias
● http://blog.nodejitsu.com/
● http://nodetuts.com/
● http://nodeup.com/
● http://groups.drupal.org/node/121174
● http://behrang.github.com/presentations/node.js/201
● http://www.rmunoz.net/introduccion-a-node-js.html
● http://nodeknockout.com/about
● https://github.com/joyent/node/wiki/Projects,-Applica
Alessandro Mascherpa, @AlessMascherpa 40 / 42
Introducción a NodeJS @tucamon, 07Nov2012

Libros

● Hands on Node:
http://www.packtpub.com/node-javascript-web-development/book
● Node Web Development:
http://nodetuts.com/handson-nodejs-book.html
Alessandro Mascherpa, @AlessMascherpa 41 / 42
Introducción a NodeJS @tucamon, 07Nov2012

¿Preguntas?

Gracias :)

Alessandro Mascherpa
@AlessMascherpa

Alessandro Mascherpa, @AlessMascherpa 42 / 42

También podría gustarte