Introducción 

a nodejs

http://goo.gl/4vpPs




NODEJS



Aquí lo tenéis:

http://nodejs.org/

¿Qué es NODEJS?

Resumidamente:

  • Se programa en JavaScript
  • Se ejecuta en servidor
  • El núcleo es V8, el motor de JavaScript
    de Google (el del Chrome)
  • Recubre V8 con un conjunto de utilidades (API)
    para acceder distintos recursos

¿Por qué nodejs?


  • Se programa rápido
  • Es eficiente
  • Es escalable
  • No bloqueante
  • No hay threads
  • Multiplataforma
  • Comunidad fantástica
  • Programación funcional
  • API potente
  • Paquetes para realizar todo tipo de tareas

Hablemos de NON BLocking
y THREADS


Un único hilo


¡Pero tengo muchos núcleos en mi procesador!

Los puedes aprovechar con Cluster y Child Process:
http://nodejs.org/api/cluster.html
http://nodejs.org/api/child_process.html

Por las decisiones de diseño que impone,
escalar horizontalmente entre máquinas es también relativamente sencillo.

HOLA MUNDO

Veamos los siguientes ejemplos:

  1. Por consola
  2. Por web
  3. Por TCP

Consola

Fichero hola.js
 console.log("Hola mundo!");

Para ejecutar:
> node hola.js

WEB

El servidor en pocas líneas:
 var http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hola Mundo!\n');
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');
Ejecutalo y abre el navegador en 
http://127.0.0.1:8000/

TCP

 var net = require('net');

net.createServer(function (stream) {
    stream.write('Hola mundo!\r\n');

    stream.on('end', function () {
        stream.end('Adiós!\r\n');
    });

    stream.pipe(stream);
}).listen(7000);
Y haz un telnet al puerto 7000

Filosofía asíncrona de node js

NodeJs se apoya en lo que se conoce habitualmente como patrón de continuación.

Miremos un poco la API:

http://nodejs.org/api/

dos conceptos


Actores: 

realizan acciones o tareas.

Callbacks: 

reciben los resultados de las acciones.

actores

  • Son funciones que hacen las tareas. Su último argumento será el callback (cb) que invocar al terminar.
  • Si ocurre algún error que el actor no sepa gestionar, se lo pasa al callback y termina su ejecución.
  • No debe utilizar "throw" y el valor de retorno se ignora



  • Es decir, un "return x" se convertiría en "return cb(null, x);"
  • Y un "throw er" pasaría a ser "return cb(er)"

callbacks


  • Los callbacks reciben los resultados de las acciones.
    Continúan con la ejecución.
  • Deben estar SIEMPRE preparados para gestionar los errores.Para garantizarlo, por convención siempre se pasará el error como primer argumento.
  • Pueden ser funciones anónimas en línea, aunque habitualmente no lo serán.
  • Puede o bien gestionar el error y llamar a otros callbacks modificando los datos, o pasar directamente el error hacia arriba.

el infierno de los callbacks


Así se denomina cuando el anidamiento de callbacks
 crece de forma descontrolada.

Se puede evitar de forma tradicional con librerías como async o Step. Lo explico en mi blog:
Aunque creo que es MEJOR resolverlo con PROMESAS que lo dejaremos para un meetup posterior.

UN ejemplillo


Vamos a leer unos ficheros de pedidos de compra y sacar algunos resúmenes.

Gestión de paquetes: npm

npm es un gestor de paquetes de Node.js

 > npm help

Permite instalar paquetes localmente o de forma global
 > npm install express > npm install express -g
La instalación de forma global puede necesitar de permisos de administrador:
 > sudo npm install express -g

Algunas instrucciones

Actualización de paquetes:
 > npm update
Eliminación de paquetes:
 > npm uninstall express
Enlazar paquetes
 > npm link colors


package.json

http://package.json.nodejitsu.com/

Información sobre la aplicación:
  • Metainformación como nombre, descripción, autor.
  • Dependencias
  • Dependencias de desarrollo
  • Repositorio
  • etc.

 > npm install colors --save

Un ejemplo

package.json

    {
    "name": "hola-mundo",
	"dependencies" : {
    	"colors"   :  "*"
    }
}
hola.js
require("colors")
console.log("Hola mundo rojo!".red);
console.log("Hola mundo verde!".green);
console.log("Hola mundo azul!".blue);
y por consola
 > npm install > node hola.js

Creando una aplicación web
con express


Instala express
  > npm install express -g
Crea una aplicación
  > express demoapp
Inspeccionemos lo que se ha creado

Arrancar la aplicación

Instala las dependencias y arráncala

 > npm install > node app
Para acelerar el redespliegue apoyate en algo como supervisor
 > npm install supervisor -g > supervisor -w routes,app.js app.js

JADE

Una herramienta de templating fundamental para generar código html fácilmente (o cualquier cosa basada en xml).

Motivaciones de Jade:
  • Evitar redundancias
  • Reducir ruido visual
  • Fomentar la reutilización

Ejemplos de código

Sintáxis compacta
 html   body     #contenedor       p Algo de texto       .campos          label(for="uncampo") Label del campo          input#uncampo(name="campo")

Case

 html
  body
    amigos = 10
    case amigos
      when 0
        p No tienes amigos
      when 1
        p Tienes un amigo
      default
        p Tienes #{amigos} amigos

Atributos

Distintas formas
 input(type='checkbox', name='agreement', checked)
input(type='checkbox', name='agreement', checked)

input(type='checkbox' name='agreement' checked)
input( type='checkbox' name='agreement' checked)

Doctype

Dos formas
 doctype !!!


doctype transitional !!! transitional
doctype 5 !!!5

Iteración

 elementos = ["un", "dos", "tres"]
each elemento,i in elementos
  li #{elemento}: #{i}


obj = { foo: 'bar' } each val, key in obj li #{key}: #{val}

Condicionales


 for user in users
  unless user.isAnonymous
    if user.role == 'admin'
      p #{user.name} is an admin
    else
      p= user.name

herencia de templates

layout.jade
 html
  head
    h1 My sitio - #{title}
    block scripts
      script(src='/jquery.js')
  body
    block content
    block foot
      #footer
        p El contenido del pie
plantilla.jade
 extends layout

 block scripts
   script(src='/jquery.js')
   script(src='/mascotas.js')

 block content
   h1= title
   each mascota in mascotas
     include mascota


blocks

Tres formas de usar blocks:
  1. Reemplazando
  2. Agregando por delante
  3. Agregando por detrás

 block scripts
  script(src='/jquery.js')
  script(src='/mascotas.js')

block prepend scripts
      script(src='/otro.js')

block append scripts
    script(src='/mascotas.js')

Mixins

Funciones para reutilizar dentro de la plantilla:

 mixin mascotas(listadoMascotas)
  ul.mascotas
    - each mascota in listadoMascotas
      li= mascota

creando proxies inversos

http-proxy
https://github.com/nodejitsu/node-http-proxy
 > npm install http-proxy
Un ejemplo sencillo:
 var httpProxy = require('http-proxy');

httpProxy.createServer(function (req, res, proxy) {
  proxy.proxyRequest(req, res, {
    host: 'localhost',
    port: 3000
  });
}).listen(8002);

YEOMAN

YO, GRUNT y bower

Profesionalizando el desarrollo de front.
Se trata de una suite muy potente para desarrolladores.
Yo: scaffolding y configuración de grunt
Grunt: construye, previsualiza y prueba el proyecto
Bower: gestión de dependencias

Arrancando

Instala las tres librerías:
 > npm install -g yo grunt-cli bower
El generador de AngularJS
 > npm install -g generator-angular
Crea tu primera app
 > yo webapp > yo angular #para crear una app angular
Agreguemos alguna dependencia
 > bower install lodash


y arrancamos grunt

Tareas más habituales:

 > grunt server
> grunt test
> grunt jade #si agregamos como tarea nuestra
Inspeccionemos el Gruntfile.js

websockets


Comunicación push y pull cliente servidor.

Nos basamos en socket.io

http://socket.io/

Veamos un ejemplo.

Introducción a NodeJS

By Gonzalo Ruiz de Villa