eit-nodejs-2015



eit-nodejs-2015

10 7


eit-nodejs-2015

Códigos del curso de Node.JS de Escuela IT 2015

On Github jonmircha / eit-nodejs-2015

Curso NodeJS 2015

de Escuela IT

por @jonmircha

Jonathan MirCha

Información del Curso

Slides y Repositorio

jonmircha.github.io/nodejs github.com/jonmircha/eit-nodejs-2015

Temas:

Presentación Consideraciones Introducción El core de Node.JS Aplicaciones Web Persistencia de Datos Comunicación Bidireccional Node.JS en Producción IO.JS

Consideraciones

  • Conocimientos sólidos de JavaScript
  • ¿No los tienes?...
  • No te preocupes XD da click aquí
  • Node.JS es emergente y cambiante
  • Sé AUTODIDACTA
  • Leé documentación
  • Aprende inglés
  • Debes manejar la terminal de comandos de tu S.O.

Clase 1

Introducción

¿Qué es Node.JS?

  • Lo que todos sabemos
  • Tiene JS
  • Es Backend
  • ¿Algo que ver con NoSQL?
  • Sirve para hacer chats
  • Lo que no está tan claro
  • ¿Es un framework JS?
  • ¿Es una librería?
  • ¿Qué tiene que ver v8?
  • ¿Para qué sirve?(además de chats)
Node.js® is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

WTF!!!

¿Entonces?

  • Si...
  • Ruby tiene Rails
  • Python tiene Django
  • PHP tiene Laravel
  • JS ¿tiene a Node.JS?

¡¡¡NO!!!

no es un Framework

Es una entorno de programación

Características de un lenguaje de programación

  • Una gramática que define su sintaxis
  • Un compilador que lo interpreta y ejecuta
  • Mecanismos para interactuar con el exterior
  • Librería estándar (consola, ficheros, red, etc.)
  • Utilidades (intérprete, depurador, paquetes, etc.)

Características de un lenguaje de programación

    • V8
      • Una gramática que define su sintaxis
      • Un compilador que lo interpreta y ejecuta
    • Node.JS
      • Mecanismos para interactuar con el exterior
      • Librería estándar (consola, ficheros, red, etc.)
      • Utilidades (intérprete, depurador, paquetes, etc.)
Node.JS Ruby Python PHP Lenguaje JavaScript Ruby Python PHP Motor V8 YARV cPython Apache Entorno Módulos del core Librerias Standard Librerias Standard Librerias Standard Frameworks Express Rails Django Laravel

En síntesis

¿Qué es Node.JS?

  • Plataforma de desarrollo de software creada en 2009
  • JavaScript en el lado del servidor
  • Basado en la máquina virtual de Chrome (V8 JavaScript Runtime)
  • V8 esta escrito en C (muy rápido)
  • Multiplataforma (Windows, Macintosh, Linux, etc.)
  • Es una marca registrada y es open source
  • Asíncrono y orientado a eventos
  • Ideal para aplicaciones que consumen datos en tiempo real y que se ejecutan a través de dispositivos distribuidos
  • Lo usan muchas empresas (WalMart, Paypal, Yahoo, LinkedIn, eBay, etc.)

Infraestructura

¿Por qué JavaScript?

JavaScript has certain characteristics that make it very different than other dynamic languages, namely that it has no concept of threads. Its model of concurrency is completely based around events
Ryan Dahl

WTF!!!

Lo que quizo decir es:

  • Compila directamente a código máquina sin un intérprete gracias a V8
  • Modelo I/O (entrada/salida) orientado a eventos, asíncrono y de no bloqueo, que lo hace ligero y eficiente

WTF!!!

Entendamos

Paralelismo y Concurrencia

Bloqueante y No Bloqueante

Síncrono y Asíncrono

  • Paralelismo: varios objetos realizando una acción cada uno simultáneamente(síncrono)
  • Concurrencia: un solo objeto, con varias tareas “activas” entre las que va alternando(asíncrono)

Node.JS es como un mesero

  • Es un Patrón Reactor del mundo real
  • Para aprovecharlo, tiene que haber varios clientes
  • Un cliente no termina más rápido por asignarle un mesero exclusivo
  • Cada cliente termina a su ritmo

blockingvsnon blocking

comensales vs meseros

blocking vs non blocking

PHP vs Node.JS

blocking vs non blocking

Infraestructura

PHP vs Node.JS

Abriendo un fichero

Blocking

  • Abrir el archivo
  • Leer el archivo
  • Imprimir contenido
  • Hacer algo más

Non blocking

  • Abrir el archivo
  • Leer el archivo
    • Cuando termines, imprimir contenido
  • Hacer algo más

Abriendo un fichero

PHP Blocking Code

					
<?php
printf("Abriendo Archivo...<br>");
$fichero_url = fopen("archivo.txt","r");

$texto = "";

while ($trozo = fgets($fichero_url)) {
    $texto .= $trozo;
}

printf($texto);

printf("<br>Haciendo otra cosa");
?>
					
				

Abriendo un fichero

Node.JS Blocking Code

					
var fs = require("fs");
console.log("\nAbriendo Archivo...");

var content = fs.readFileSync("archivo.txt","utf8");
console.log(content);

console.log("\nHaciendo otra cosa\n");
					
				

Abriendo un fichero

Node.JS Non Blocking Code

					
var fs = require("fs");
console.log("\nAbriendo Archivo...");
 
var content = fs.readFile("archivo.txt","utf8", function(error,content){
   console.log(content);
});

console.log("\nHaciendo otra cosa\n");
					
				

¿Cuál es la diferencia?

Callback

Es una pieza de código ejecutable que se pasa como argumento a otro código.

Con la callback estamos logrando un comportamiento asincrónico, es decir, de no bloqueo

El código se ejecuta y no espera a que la lectura se complete, cuando esta termine se imprime el contenido.

Really Callbacks Dude?

Callback Hell

Evitando Callback Hell

					
var fs = require("fs");
console.log("\nAbriendo Archivo...");

function imprimir(error,content){
   console.log(content);
}
 
var content = fs.readFile("archivo.txt","utf8", imprimir);

console.log("\nHaciendo otra cosa\n");
					
				

(también se puede con promesas)

Single Thread

Event Loop

Event Loop

Características de Node.JS

  • Es concurrente sin paralelismo
  • Es asíncrono y no bloqueante
  • Orientado a eventos
  • Single thread basado en callbacks

Si eres Frontend

  • Es tu mejor opción para hacer backend por qué ya sabes JavaScript (o deberías
    XD
    )
  • Si no te interesa el backend, sus módulos te harán mejor frontend (bower, grunt, gulp, less, browserify, etc.)
  • Si tu editor de código es brackets ya usas Node.JS
    =D
  • Puedes comenzar tu carrera como Full Stack JavaScript Developer (MEAN.JS o MEAN.IO)

¿Entonces?

¿Qué podemos hacer?

  • Aplicaciones cliente - servidor
  • Aplicaciones servidor - servidor (networking)
  • Chats, Juegos, Clientes de Correo, Traductores
  • Aplicaciones Colaborativas y Redes Sociales
  • Estadísticas y Analíticas
  • Aplicaciones de Red (línea de comandos o admin. de sistemas)
  • Sitios Web, Blogs y CMS's
  • Controlar Hardware
  • En un futuro... dominar al mundo... \
    }=D
    / de la web

No podrás decir qué no

  • Arquitectura unificada(JavaScript Full Stack)
  • Código reutilizable(frontend, backend y base de datos)
  • Excelente rendimiento y escalabilidad
  • Fuerte y apasionada comunidad
  • Desarrolladores felices  
    :)

Sólo considera qué...

  • JS en el Frontend
  • No me importa el S.O.
  • No hay datos binarios
  • Apenas hay E/S
  • Un único usuario
  • Todo es accesible con objetos y valores primitivos
  • JS en el Backend
  • Llamadas al S.O.
  • Muchos datos binarios
  • Muchas E/S
  • Usuarios y permisos
  • Puertos y Servidores
  • Middlewares
  • ...

Requisitos Clase 2

Instalación

Probando Instalación

  • Abrir una terminal de comandos
  • node -v
  • npm -v

Terminal de Comandos

Recomendaciones

  • Recuerda que para el correcto funcionamiento de Node.JS tu usuario debe ser Administrador del Equipo
  • Si tu terminal no reconoce los comandos:
    • En Mac o Linux debes ejecutarlos con el comando sudo
    • En Windows, reinicia y verifica que en las variables de entorno exista NODE_PATH

Estudien:

BE NODE.JS

Clase 2

El core de Node.JS

El núcleo de Node.JS esta formado por 35 módulos

Es importante revisar su nivel de estabilidad al usarlos:

  • 0 - Deprecated
  • 1 - Experimental
  • 2 - Unstable
  • 3 - Stable
  • 4 - API Frozen
  • 5 - Locked

Toda la información del núcleo está en el API DOCS

Menú del Día:

Clase 3

Más core

Menú del Día:

  • Path
  • URL
  • Query String
  • Servir archivos estáticos
  • Rutas y URL's amigables
  • Cliente HTTP
  • Sniffer
  • Formularios
  • GET y POST

Clase 4

Menú del Día:

  • NPM
  • Módulos / Paquetes
  • El archivo package.json

NPM

Node Package Manager

Es el gestor de paquetes de Node.JS

Instalando paquetes

Tipos de Instalación

  • Única: npm install nombre-paquete (no se recomienda)
  • Global: npm install nombre-paquete -g
  • Como dependencia del proyecto:npm install nombre-paquete --save
  • Como dependencia de desarrollo:npm install nombre-paquete --save-dev

Paquetes Globales

  • Se instalan localmente en nuestro ordenador
  • Estan disponibles en todo momento
  • Son paquetes que nos ayudarán con tareas administrativas (monitoreo, depuración, automatización, etc.)

Paquetes Globales

Dependencias del Proyecto

  • Paquetes externos al core
  • Desarrollados por la comunidad
  • Al instalarlos quedan registrados en el achivo de configuración (package.json)

package.json

  • creación (npm init)
  • configuración
  • instalar paquetes como dependencias:npm install nombre-paquete --save
  • instalar dependencias de un proyecto:npm install (Debe existir el archivo package.json)
  • Revisar Semantic Versioning para el correcto versionado de nuestros paquetes.

Paquetes como dependencias

Clase 5

Menú del Día:

  • Promesas

Node.js maneja la asincronía utilizando callbacks

  • Continuaciones explícitas como funciones
  • Cuando termines... ejecuta otra función

Los callbacks tienen muchas ventajas

  • Muy fáciles de entender e implementar
  • Familiares para el programador JS
  • Extremadamente flexibles
  • Un mecanismo universal de asincronía

PERO...

Callback Hell

Callbacks VS Promesas

Promesas

Una manera alternativa de modelar asincronía

  • Construcción explícita del flujo de ejecución
  • Separación en bloques consecutivos
  • Manejo de errores más controlado
  • Combinación de diferentes flujos asíncronos

promesa = flujo de ejecución

Promesas

Ventajas

  • Código mucho más ordenado y legible
  • Mejor control de errores
  • Podemos manipular el flujo
  • Añadir nuevas etapas
  • Devolverlo en funciones
  • Pasarlo como parámetro
  • Podemos combinar varios flujos

Promesas

¿Cómo lo hace?

  • .then(succes,[error])
    • Concatena bloques
    • El nuevo bloque (success)...
      • Sólo se ejecuta si el anterior lo hace sin errores
      • Recibe como parámetro el resultado del bloque anterior
      • Devuelve el valor que se le pasará al siguiente bloque
        • Si es un dato, se pasa tal cual
        • Si es una promesa, se resuelve
  • .fail(error)
    • El segundo parámetro es un manejador de error

Las promesas se resuelven o se rechazan y se dividen en 2:

  • La promesa en sí
    • Interfaz que construye flujos
    • (.then y .fail)
  • Su diferido
    • Interfaz que controla los flujos
    • (.reject y .resolve)

Casi todos los módulos de Node.JS que realizan una operación asíncrona siguen el mismo flujo:

  • Reciben una callback como último parámetro
  • El callback recibe uno o más parámetros:
    • Generalmente el primero indica si hay error:
      • Si es falso todo OK
      • Si es verdadero es el Error

Paquetes como dependencias

Clase 6

Menú del Día:

  • Dependencias de Desarrollo

Dependencias de Desarrollo

  • Paquetes externos al core
  • Desarrollados por la comunidad
  • Facilitan y optimizan tareas comunes de desarrollo y publicación
  • Al instalarlos quedan registrados en el package.json
  • npm install nombre-paquete --save-dev

Dependencias de Desarrollo

Sistemas de Construcción

Build Systems

Permiten automatizar tareas comunes de desarrollo, tales como la minificación de código, recarga del navegador, compresión de imágenes, validación de sintaxis de código y un sin fin de tareas más

No importa si eres un desarrollador Frontend, Backend o ambos. Si hoy en día no quieres perder tiempo realizando tareas comunes manualmente, debes usarlos.

Configuración VS Código

Grunt

Gulp

Bower

Gestor de paquetes para la web

(frameworks, librerías, utilidades, recursos, etc.)

  • npm install bower -g
  • bower install nombre-paquete
  • bower init
  • bower.json
  • bower install nombre-paquete --save
  • bower install

Preprocesadores CSS

  • Compilando lessarchivo.less > archivo.css
  • Compilando stylusstylus -c archivo.styl archivo.css

Browserify

Permite requerir dependencias y librerías del navegador como módulos de Node.JS

  • browserify main.js > bundle.js

JSHint

Detección de Errores JS

Clase 7

Menú del Día:

  • Optimizando un proyecto Frontend con módulos JS
  • Frameworks Web para Node.JS
  • Introducción a Express

Optimizando un proyecto Frontend con módulos JS

Aplicaciones Web con Node.JS

Frameworks

es un marco de herramientas diseñado para apoyar el desarrollo de sitios dinámicos, aplicaciones y servicios web. Intenta aliviar el exceso de carga asociado con actividades comunes usadas en el desarrollo web. Por ejemplo, acceder a bases de datos, estructuras para plantillas y gestión de sesiones, y con frecuencia facilitan la reutilización de código.

Frameworks Node.JS

Express

Express

  • Estrictamente web (microframework)
  • Sencillo, flexible y minimalista
  • Muy popular
  • Se adapta muy bien a la filosofía de Node
  • Similar a Sinatra, Sylex, Flask, Spark, etc.

Express nos va ayudar con:

  • Rutas
  • Parámetros
  • Formularios y subida de ficheros
  • Cookies
  • Sesiones
  • Templates

Express NO nos va ayudar con:

  • Base de datos / ORM
  • Autenticación de usuarios
  • Seguridad
  • Migraciones
  • Deployment
  • Organización del código

Concretamente Express:

  • Construye sobre http
  • Procesa la petición a través middlewares
    • Asocia rutas a manejadores
    • Procesa los objetos req y res
    • Visualiza templates
  • Nosotros escogemos qué middlewares queremos usar, y en qué orden

¿Qué nos aporta express, exactamente?

  • Depende de los middlewares que usemos
  • Algunas cosas vienen por defecto

Let's to Code! \

XD
/

Pero... NO te olvides del API Doc

Clase 8

Menú del Día:

  • Fundamentos de Express

Express API:

Configurando la aplicación

  • Crear algunas propiedades globales
  • Especificar el stack de middlewares

¿Cómo la configuramos?

  • Estableciendo: app.set(propiedad, valor)
  • Obteniendo: app.get(propiedad)
  • Usando: app.use(middleware)

Middleware

Son módulos “plug and play” que se pueden apilar arbitrariamente en cualquier orden y proveen cierta funcionalidad

  • Filtros: procesan tráfico entrante/saliente, pero no responden a ninguna petición. Por ejemplo bodyParser
  • Proveedores: ofrecen respuestas automáticas a algún tipo de petición. Por ejemplo static

Middlewares

Escribir middlewares para express es muy sencillo:

  • Una función que recibe 3 parámetros: req, res, next
  • Al terminar su tarea, tiene que invocar a next()
    • Sin parámetro: se invoca al siguiente middleware del stack
    • Con parámetro: se cambia la ruta a lo que se pase como parámetro
  • Dos maneras de activar middlewares:
    • Globalmente (app.use), activos para toda la app
    • Locales para ciertas rutas

Express se ayuda de paquetes adicionales, para mantener su core simple y minimalista

favicon(ruta)

Sirve el favicon de la aplicación

  • Debe ser el primero
  • Para evitar peticiones inncesarias

logger([opciones])

Registro de Actividad

  • Muchas opciones...
  • Se suele poner debajo de express.favicon()

cookieParser([secreto])

Parsea las cookies de la petición

  • Opcional: firmar cookies con secreto
  • Crea el objeto req.cookies

bodyParser()

Parsea el cuerpo de las peticiones

  • Decodifica
    • application/json
    • application/x-www-form-urlencoded
    • multipart/form-data
  • Crea el objeto req.body con los parámetros
  • Crea el objeto req.files con los ficheros que se han subido desde un formulario

cookieSession([opciones])

Inicializa y parsea los datos de sesión del usuario

  • Crea el objeto req.session
  • Utilizando cookies como almacenamiento
  • Algunas opciones:
    • secret: firma de segurdad para la cookie
    • maxAge: duración en ms
    • path: ruta para la que es válida la cookie
    • httpOnly: protección solo en el protocolo http

express.static(directorio)

Sirve los ficheros estáticos dentro de directorio

  • ¡Muy útil! Se pone cerca del final
  • Cachea los ficheros
  • La variable global __dirname contiene el directorio donde reside el script en ejecución

Generador de Express

npm install express-generator -g

express miAppExpress

Clase 9

Menú del Día:

  • Templates Engines (Motores de Plantillas)

Templates Engines

Express tiene un mecanismo para renderizar plantillas

  • Agnóstico
  • Modular
  • Simple
  • NO trae ningún motor de templates por defecto

Templates Engines

res.render(view, [locals], callback)

  • view: ruta del template
  • locals: valores a interpolar
  • callback: function(err, html) { ... }

Templates Engines

Tenemos muchos motores de plantillas para elegir

Nosotros aprenderemos:

Pero hay más opciones

Clase 10

Menú del Día:

  • Web Scraping (Extracción de Información Web)

Web Scraping

es el proceso de recopilar información de forma automática de la Web. Está muy relacionado con la indexación, es una técnica universal adoptada por la mayoría de los motores de búsqueda.

Web Scraping

El término también está relacionado con la automatización de tareas en la Web, la cual simula la navegación de un humano utilizando un software de computadora.

Web Scraping

El web scraping pudiera ir en contra de los términos de uso de algunos sitios webs. El cumplimiento de estos términos no está totalmente claro.

=P

Paquetes para Web Scraping:

  • express (Como Framework Web)
  • request (Para obtener el código HTML de la petición)
  • cheerio (Para usar jQuery en el backend y obtener información de la petición)
  • q (Para implementar promesas a la aplicación)

Clase 11

Menú del Día:

  • Web Scraping mejorado con promesas
  • Ghost

Ghost

  • Es la plataforma de blog de Node.JS
  • Es libre y de código abierto
  • Creada por John O'Nolan en 2013
  • ¿Es el WordPress de Node.JS?

Un poco de Historia:

  • O'Nolan era el lider adjunto del equipo de interfaz de usuario de WordPress
  • En noviembre de 2012 al sentirse frustrado de usar WordPress como plataforma de blogs comienza a gestar una plataforma que fuera más simple, sencilla y limpia
  • En abril de 2013 comienza una campaña de crowdfunding en Kickstarter para comenzar Ghost
  • En septiembre de 2013 se libera la primer versión de Ghost
  • En octubre de 2013 se libera el código en github

¿Porqué Ghost, teniendo WordPress?

  • WordPress es más que sólo una plataforma de Blog
  • Algunas diferencias interesantes

Let's to Blog! \

XD
/

Pero... NO te olvides de la User Guide

Clase 12

Menú del Día:

  • Persistencia de Datos con Node.JS
  • API's CRUD
  • API's REST
  • Gestores de Bases de Datos

Persistencia de Datos

Aplicaciones CRUD

VS

Aplicaciones REST

REST

Representational State Transfer

Transferencia de Estado Representacional

REST

Es una técnica de arquitectura software para sistemas hipermedia distribuidos como Internet

El término lo acuña Roy Fielding en su tesis doctoral del año 2000 sobre la web

Es uno de los principales autores de la especificación del protocolo HTTP

REST se basa en las operaciones del protocolo HTTP

REST afirma que la web ha disfrutado de escalabilidad como resultado de una serie de diseños fundamentales clave:

  • Un protocolo cliente/servidor sin estado
  • Un conjunto de operaciones bien definidas que se aplican a todos los recursos de información
  • Una sintaxis universal para identificar los recursos
  • El uso de hipermedios

Los sistemas que siguen los principios REST se llaman con frecuencia RESTful

Los estados HTTP de una API REST son:

  • POST

  • GET

  • PUT

  • DELETE

Más informción sobre REST:

CRUD

Create, Read, Update and Delete

ABCC

Altas, Bajas, Cambios y Consultas

En computación se usa para referirse a las funciones básicas que un sistema utiliza para interactuar con su capa de persistencia (bases de datos).

Persistencia en Node.JS

Prácticamente se puede trabajar con cualquier base de datos: Transaccionales, Relacionales, Documentales, Orientada a Objetos, Clave/Valor, de Grafos, etc.

En el curso trabajaremos con:

Base de Datos Documental Base de Datos Transaccional
(NO SQL - BSON) (SQL)
Colecciones y Documentos Tablas y Registros

Clase 13

Menú del Día:

  • API CRUD MySQL
  • API REST MySQL

Módulos nuevos que emplearemos:

Clase 14

Menú del Día:

  • API REST MySQL con MVC
  • Introducción a MongoDB

¿Qué es MongoDB?

Una base de datos NoSQL...

  • Sin esquema
  • Alto rendimiento
  • Almacena documentos BSON
  • Enfocada en escalabilidad horizontal
  • Lenguaje de consultas potente
  • Sin transacciones
  • Agregado de datos

¿Qué es MongoDB?

Una base de datos de documentos

  • No impone forma a los datos
  • No necesita migraciones/reestructuración de la BBDD
  • Permite estructuras muy complejas
  • Herramientas potentes de agregado con JavaScript
    • Map-Reduce
    • Aggregation Pipeline

¿Qué es MongoDB?

Con algunos extras interesantes...

  • Índices geoespaciales
  • Búsquedas FTS
  • Almacenamiento eficiente de blobs y ficheros
  • Sharding automático
  • Replicación

¿Qué es MongoDB?

Es una buena alternativa para... ¡muchas cosas!

  • Prototipos y aplicaciones simples
  • Hacer la transición de front a back
  • Aplicaciones con mucha carga de escritura
  • Agregado de datos a un nivel medio/alto
  • Aplicaciones con datos muy heterogéneos
  • Enormes colecciones de datos (sharding)
  • Almacenar ficheros (sharding)

¿Qué NO es MongoDB?

  • No puede hacer JOINs
  • El lenguaje de consulta menos potente que SQL
  • No tiene transacciones
  • Ten cuidado:
    • Es muy fácil empezar con MongoDB
    • Si tu app crece mucho... vas a necesitar JOINs

MongoDB no puede hacer JOINs

  • Sin embargo, se pueden empotrar documentos y arrays
  • Profundidad y complejidad arbitraria
  • El límite: documento < 16MB
  • Se suelen favorecer los diseños desnormalizados

La idea general de MongoDB

Es un almacén de documentos

  • Básicamente, objetos JSON (BSON)
  • Dividido en colecciones
  • Consultas basadas en la estructura del documento
  • ¡Se integra genial con JavaScript!

Requisitos:

Clase 15

Menú del Día:

  • Primeros pasos con MongoDB
  • API REST MongoDB

Cliente Mongo

MongoDB trae un cliente de línea de comandos

  • mongo host/dbname
  • Ejecuta JavaScript
  • Muy práctico para explorar

Conceptos básicos

  • La base de datos está dividida en colecciones
  • Las colecciones tienen documentos
  • Los documentos son objetos BSON (JSON Binario )

Colecciones

Una colección es una agrupación de documentos

  • Puede alojar cualquier documento (no impone estructura)
  • Puede alojar documentos con diferentes formas
  • Operaciones de consulta
  • Es donde se ponen los índices

Estructura de un Documento

					
{
	"_id" : ObjectId("524872a99c50880000000001"),
	"email" : "j@bextlan.com",
	"password" : "qwerty",
	"name" : "Jonathan",
	"date" : 1380479657300,
	"token" : "hm6ly43v.0o1or"
}
					
				

Un documento puede contener arreglos y otros documentos

					
{
	"_id" : ObjectId("5249a2e9b90687d56453b2f3"),
 	"text" : "Soy un comentario",
 	"user" : {
 		"_id" : ObjectId("524872a99c50880000000001"),
 		"nombre" : "Usuario Prueba",
 		"avatar" : "/img/user-test.jpg"
 	},
 	"tags" : [ "test", "prueba" ]
}
					
				

Operaciones con colecciones:

  • collection.save: guardar/actualizar un documento
  • collection.insert: inserta un documento
  • collection.findOne: recuperar un documento
  • collection.find: recuperar varios documentos
  • collection.remove: borrar uno o varios documentos
  • collection.drop: elimina la colección
  • collection.rename: cambia de nombre la colección
  • collection.count: número de documentos

Operadores de Búsqueda:

  • $gt / $gte: mayor/mayor o igual
  • $lt / $lte: menor/menor o igual
  • $ne: diferente
  • $in / $nin: en/no en array de valores
					
micol.findOne({ valor: {$in:[5,15]} }, cb)
					
				

Operadores Lógicos:

  • $or: se cumple alguna cláusula
  • $and: se cumplen todas las cláusulas
  • $nor: el resultado opuesto
  • $not: no se cumplen todas las cláusulas
					
micol.findOne({
	$or:[
		{valor: 5},
		{
			precio:{ $gt: 15 }
		}
	]
},callback)
					
				

Más operadores interesantes

Consulta

El operador find(...) devuelve un cursor

  • Representa un conjunto de resultados
  • cursor.count(cb): cantidad de documentos
  • cursor.limit(n): limitar a n documentos
  • cursor.skip(n): saltarse los n primeros documentos
  • cursor.nextObject(cb): siguiente documento
  • cursor.each(cb): para cada doc, en orden
  • cursor.toArray(cb): convierte el cursor en array

Ordenación

cursor.sort(opciones, [cb])

  • Ordenar los resultados
  • Opciones del tipo:
    • [[“campo”, 1], [“otroCampo”, -1]]
    • 1 para ascendente, -1 para descendente
					
coleccion.find()
	.sort([['a', -1]])
 	.nextObject(function(err, item) {
 		// ...
 	})
					
				

Inserción

insert(<documento o array>)

  • Inserta uno o varios documentos en la colección
					
db.micol.insert([
	{ nombre: "Usuario Prueba" },
	{ nombre: "Usuario Prueba 2" }
])
					
				

Modificación

El operador más sencillo para modificar: save

  • Si el documento es nuevo (no tiene _id), lo inserta
  • Si el documento ya existe, lo modifica
					
db.micol.save({ nombre: "Usuario Prueba" })
					
				

Eliminación

remove(<patrón>)

  • Elimina los documentos que satisfagan la búsqueda
					
db.micol.remove({ nombre: "Usuario Prueba" })
					
				

\

}=)
/ ESTUDIA \
}=)
/

Módulos nuevos que emplearemos:

Let's to Code! \

XD
/

Clase 16

Menú del Día:

  • API REST MongoDB con MVC
  • Autenticación Express con MySQL
  • Modularizar Middlewares

Módulos nuevos que emplearemos:

Clase 17

Menú del Día:

  • Autenticación Express con MySQL
  • Autenticación Express con MongoDB

Clase 18

Menú del Día:

  • Socket.IO

¿Qué son websockets?

Protocolo de comunicación

  • Full-duplex
  • Una sola conexión permanente
  • Stream de mensajes
  • Contenido en tiempo real

¿Qué son websockets?

Es decir...

  • El cliente puede enviar y recibir datos en tiempo real
  • Orientado a "eventos" (mensajes)
  • Siempre conectado
  • Baja latencia

Websockets y Node.JS

Funcionan bien

}=D

  • El servidor maneja muchas conexiones simultáneas
  • Buena integración con JSON
  • Eventos

¿Para qué sirven?

Fundamentalmente, para:

  • Actividades colaborativas
  • Juegos multijugador
  • Enviar datos
  • Cargar recursos
  • En resumen: tiempo real en vez de "a petición"

Socket.IO

Vamos a usar Socket.IO

  • Una librería para manipular websockets
  • Muy popular
  • Fallback para navegadores obsoletos
  • Muy fácil de usar
  • Servidor / Cliente
  • API DOC

Socket.IO

Los sockets emiten eventos

  • Un evento = un "mensaje"
  • Se pueden pasar parámetros
  • socket.on(mensaje, callback)
  • socket.emit(mensaje, [param1, param2, ...])

Socket.IO

Eventos reservados en el:

  • Servidor:
    • io.sockets.on("connection", cb)
    • socket.on("message", cb)
    • socket.on("disconnect", cb)
  • Cliente:
    • socket.on("connect", cb)
    • socket.on("disconnect", cb)
    • socket.on("error", cb)
    • socket.on("message", cb)

Let's to Code! \

XD
/

Clase 19

Menú del Día:

  • Chat con Express y Socket.IO
  • Streaming de Video con Socket.IO

Streaming de Video:

Considerar las siguientes API's:

Let's to Stream! \

XD
/

Clase 20

Menú del Día:

  • Node.JS en Producción
  • io.js

Node.JS en Producción

Opciones de Hosting para Node.js

  • ☓Hosting Compartido
  • ✔Hosting Dedicados
  • ✔Hosting Virtuales (VPS)
  • ✔Hosting en la Nube (Cloud Service)
  • + info

Para esta ocasión usaremos Digital Ocean

Considerar los siguientes posts:

Let's to Deploy! \

XD
/

io.js

io.js

Es un fork amigable de Node.js™, compatible con npm, liderado bajo un modelo de open governance

¿Por qué io.js?

¿Entonces?

io.js

Está lidereado por los contribuyentes más activos de Node.JS y el CEO de NPM

Su objetivo es arreglar de lo que carece Node.JS

io.js

  • Soporte para las últimas versiones de V8
  • Desarrollo activo haciendo liberaciones semanales
  • Integración continua y ejecución de pruebas al 100%
  • Vinculación con la comunidad
  • Gobernabilidad abierta por la comunidad y no por empresas
  • Hoja de ruta predecible
  • Versiones compatibles con SemVer
  • Comienza a incrementar su actividad

La reacción de Joyent, propietario de Node.JS fue lanzar la versión 0.12.X que la comunidad estaba esperando por casi 2 años, con ello Joyent logra mantener la paridad de características con io.js

Todo esto sucede en diciembre del 2014 y io.js se libera el 13 de enero del 2015

  • Limita objetivos a largo plazo
  • Soporte completo en servidores y gestores de paquetes
  • Marca ampliamente conocida y reconocida
  • Comunidad muy activa
  • Soporte a ES6
  • Rendimiento ligeramente superior
  • Liberaciones rápidas utilizando semver

¿Reconciliación?

La comunidad io.js es inflexible sobre el mantenimiento de la paridad de características

Ambas partes han manifestado en repetidas ocasiones su intención general de la reconciliación.

La fundación Linux se ha ofrecido como mediador en la situación.

La Fundación Node

El escenario más prometedor en estos momentos es crear la Fundación Node que conste de 2 partes:

  • Un consejo de fundación encargado de la parte legal, marca, mercadotecnia y fondos
  • Un comite técnico que actué de forma independiente y permita el crecimiento del ecosistema JS en el servidor
  • Ya existe un repo en Github

Más sobre esta tecno novela

Conclusiones

  • Node.JS 0.12.X y io.js son totalmente compatibles y se pueden utilizar indistintamente.
  • io.js seguirá teniendo más contribuciones de la comunidad y, por tanto, introducirá y liberará más características, así como arreglará errores antes que Node.JS (por ejemplo el manejo de promesas).
  • En algún punto ambos proyectos se unificarán.
  • No le conviene a Joyent ponerse en contra de una gran y apasionada comunidad JS
  • Mucho se habla de que la versión 2 de io.js se unificará con la versión 1 de Node

Yo recomendaría usar io.js ahora mismo, aprovechar sus beneficios y no retrasar el aprendizaje hasta que ambos proyectos se unifiquen.

Comienza a estudiar

=P

Y una cosa más...

JS es el futuro de la web

como se llame el entorno es lo de menos

):D
/

=D
Muchas Gracias
=D

¡Hasta la próxima!

@jonmircha / j@bextlan.com

Curso NodeJS 2015 d