![Page 1: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/1.jpg)
NodeJS & ExpressDesarrollo Web 2.0 Eficaz
Betabeers Barcelona 23/03/2012
![Page 2: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/2.jpg)
Quienes somos?
Christophe Eymardemail : [email protected]
Félix Delval twitter : @fe_lix_email : [email protected]
https://github.com/ravelsoft
![Page 3: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/3.jpg)
NodeJS
![Page 4: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/4.jpg)
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
![Page 5: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/5.jpg)
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome
![Page 6: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/6.jpg)
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome● Runtime en Javascript
![Page 7: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/7.jpg)
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome● Runtime en Javascript● Multi-Plataforma : Windows, Linux, OS X
![Page 8: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/8.jpg)
Qué es NodeJS
● LibUV : Una biblioteca desarrollada por Joyent en C
● V8 : El motor Javascript de Google Chrome● Runtime en Javascript● Multi-Plataforma : Windows, Linux, OS X● NPM : Package Manager (www.npmjs.org)
![Page 9: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/9.jpg)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
![Page 10: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/10.jpg)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU
![Page 11: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/11.jpg)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-
balancer
![Page 12: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/12.jpg)
Synchronous vs. Asynchronous
![Page 13: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/13.jpg)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-
balancer● Compartir código entre cliente e servidor
![Page 14: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/14.jpg)
Porque NodeJS
● Un Sólo Hilo○ ¡ (casi) adios mutex y race-condition !
● Asíncrono (Non Blocking) : ○ Uso óptimo del CPU○ « scaling » más evidente : más procesos y un load-
balancer● Compartir código entre cliente e servidor● V8
![Page 15: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/15.jpg)
V8 en el mundo Real (más o menos)
fuente: http://shootout.alioth.debian.org
![Page 16: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/16.jpg)
Desarrollar en NodeJS
● Programación por callbacks
![Page 17: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/17.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX
![Page 18: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/18.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
![Page 19: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/19.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop
![Page 20: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/20.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.
![Page 21: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/21.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado
![Page 22: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/22.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado
● ... hay que respetarle
![Page 23: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/23.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado
● ... hay que respetarle○ Cuidado con el uso del CPU
![Page 24: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/24.jpg)
Desarrollar en NodeJS
● Programación por callbacks○ Parecido a request AJAX○ « Hilos cooperativos »
● El event-loop○ epoll / kpoll / etc.○ Llama las callbacks cuando tienen su resultado
● ... hay que respetarle○ Cuidado con el uso del CPU○ process.nextTick
![Page 25: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/25.jpg)
Hello World
var http = require('http'); function miRespuesta(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}var server = http.createServer(miRespuesta)server.listen(1337, '127.0.0.1');
![Page 26: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/26.jpg)
Mal Ejemplo : Fibonacci
![Page 27: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/27.jpg)
Mal Ejemplo : Fibonacci
var http = require('http'); function fibonacci(n) { if (n <= 1) return n; else return fibonacci(n - 1) + fibonacci(n - 2);}http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") res.end("Fibo : " + fibonacci(33)); // OUCH else res.end('Hello World\n');}).listen(1337, '127.0.0.1');
![Page 28: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/28.jpg)
Mal Ejemplo II, pero mejor
var http = require("http") function fibonacci(n, cbk) { if (n <= 1) cbk(n); else fibonacci(n - 1, function(_n_1) { process.nextTick(function() { fibonacci(n - 2, function( _n_2) { cbk(_n_1 + _n_2) }) }) })}
http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") { fibonacci(33, function(fibres) { res.end('Fibo: ' + fibres + '\n'); }) } else { res.end('Hello World\n'); } }).listen(1337, '127.0.0.1');
![Page 29: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/29.jpg)
![Page 30: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/30.jpg)
Express
![Page 31: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/31.jpg)
Express y su comunidad
+ de 5500 watchers + de 540 forks + de 100 issues abiertas
source : github.com
![Page 32: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/32.jpg)
¿ Que propone ?
● Router de URL Con get, post,...
![Page 33: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/33.jpg)
¿ Que propone ?
● Router de URL Con get, post,...● Facilidades para motores de plantillas:
Jade, EJS, JinJS, ...
![Page 34: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/34.jpg)
¿ Que propone ?
● Router de URL Con get, post,...● Facilidades para motores de plantillas:
Jade, EJS, JinJS, ...
● Middleware via Connect y en cada función de routing
![Page 35: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/35.jpg)
¿ Que propone ?
● Router de URL Con get, post,...● Facilidades para motores de plantillas:
Jade, EJS, JinJS, ...
● Middleware via Connect y en cada función de routing
● focus en alta rendimiento● muy buen test coverage
![Page 36: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/36.jpg)
Base del routing
app.get('/post/:post', myfun);app.get(\/post\/([^\/]+)\/?, my fun); matched : /post/123 /post/foobar /post/foobar not matched : /post/foo/bar
![Page 37: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/37.jpg)
Plantillas con Jade
!!! 5html head title Blog link(rel='stylesheet', href='/stylesheets/style.css') body #container block content
![Page 38: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/38.jpg)
Instalación
# npm install -g express
![Page 39: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/39.jpg)
Hello, World!
var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);
![Page 40: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/40.jpg)
Hello, World!
var express = require('express');var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World');}); app.listen(3000);
![Page 41: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/41.jpg)
El test más inútil del mundo
$ ab -n 10000 -c 1000 http://localhost:3000 Concurrency Level: 1000Time taken for tests: 19.458 secondsComplete requests: 100000Requests per second: 5139.34 [#/sec] (mean)Time per request: 194.578 [ms] (mean)Time per request: 0.195 [ms] (mean, across all concurrent requests)
Intel i3 540 @ 3.07GHz / 8 GB RAM
![Page 42: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/42.jpg)
con Express
Creación deun blog básico
![Page 43: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/43.jpg)
Bootstrapping el proyecto
$ express misuperblog $ cd misuperblog $ npm install
![Page 44: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/44.jpg)
Estructura de la applicaciónmisuperblog|-- package.json /* Contiene las dependencias, autores */|-- app.js /* Archivo principal de la applicación */|-- public /* Archivos estaticos */| |-- images| |-- stylesheets| | `-- style.css| `-- javascripts|-- views /* Contiene todo los templates */| |-- index.jade| `-- layout.jade`-- routes /* Routing y codigo de cada view */ `-- index.js
![Page 45: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/45.jpg)
El datastore
var Post = require ('./models/post'); p = new Post();{ id: 1, title: undefined, body: undefined, createdAt: Fri, 23 Mar 2012 14:23:30 GMT } p.save(); Post.all(); Post.get();
![Page 46: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/46.jpg)
En conclusión !
Node.js :● V8 → Velocidad● Libuv → Asíncrono● Javascript → Languaje único Express :● Routing potente● Plantillas modulares● Middleware
![Page 47: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/47.jpg)
Buenas referenciashttp://nodejs.org/http://visionmedia.github.com/masteringnode/http://expressjs.com/http://nodeup.com/http://nodejs.org/
Los gurushttps://github.com/substackhttps://github.com/isaacshttps://github.com/visionmediahttps://github.com/felixge
![Page 48: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/48.jpg)
¿ Algunas preguntas?
![Page 49: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/49.jpg)
Alternativas a los Callbacks
● StreamlineJS● node-fibers● async/step
![Page 50: Creación de aplicaciones web con Node.js y Express](https://reader036.vdocuments.pub/reader036/viewer/2022081801/5556b11dd8b42a3f7e8b5236/html5/thumbnails/50.jpg)
Bonus : el mal ejemplo con Streamlineif (!require('streamline/module')(module)) return; var http = require("http") function fibonacci(n, _) { if (n <= 1) return n; var res = fibonacci(n - 1, _); process.nextTick(_); return res + fibonacci(n - 2, _);}
http.createServer(function (req, res, _) { res.writeHead(200, {'Content-Type': 'text/plain'}); if (req.url == "/fibo") res.end('Fibo: ' + fibonacci(33, _) + '\n'); else res.end('Hello World\n');}).listen(1337, '127.0.0.1');