1. Introducción a Node.js
Grupo de usuarios Drupal Alicante + @tucamon
07/11/2012
http://vimeo.com/53137688
Alessandro Mascherpa
@AlessMascherpa
2. 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
3. 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
4. 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
5. 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
6. 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
7. 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
10. Introducción a NodeJS @tucamon, 07Nov2012
Blocking
<?php
<?php
result = query("select...");
result = query("select...");
// esperar y usar result
// esperar y usar result
?>
?>
Ref:
http://magnetik.github.com/node-webid-report/
Alessandro Mascherpa, @AlessMascherpa 10 / 42
12. Introducción a NodeJS @tucamon, 07Nov2012
NonBlocking
query("select...", function (result) {
query("select...", function (result) {
// usa result
// usa result
});
});
//haz otra cosa
//haz otra cosa
Ref:
http://magnetik.github.com/node-webid-report/
Alessandro Mascherpa, @AlessMascherpa 12 / 42
14. Introducción a NodeJS @tucamon, 07Nov2012
Blocking vs NonBlocking
Alessandro Mascherpa, @AlessMascherpa 14 / 42
15. Introducción a NodeJS @tucamon, 07Nov2012
Blocking vs NonBlocking
Alessandro Mascherpa, @AlessMascherpa 15 / 42
16. 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
17. 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
19. 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
20. Introducción a NodeJS @tucamon, 07Nov2012
Node Package Manager: npm
● Repositorio de módulos
$ npm list
Node.js
● Gestiona instalación, connect@1.7.0
actualización ... de qs@0.3.1
módulos Node.js mime@1.2.3
● Node.js permite la express@1.0.7
coexistencia de diferentes connect@1.7.0
versiones de un módulo en qs@0.3.1
el sistema. mime@1.2.2
qs@0.3.1
● NPM incluido en Node.js
desde la versión 0.6.x Ref: http://npmjs.org/
Alessandro Mascherpa, @AlessMascherpa 20 / 42
21. 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
24. 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
25. 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
26. 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
27. 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
28. 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
29. 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
30. 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
31. 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
32. 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
33. 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
34. 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
38. 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
39. 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