Bextlán
Node.js

Curso Node.js de Bextlán

Jonathan MirCha - @jonmircha

Curso Node.js

Node.js

de Bextlán

por @jonmircha

SLIDES

jonmircha.github.io/slides-nodejs

Jonathan MirCha
Instructor Web & Arquitecto de Front end

Temas:

  1. Inicio
  2. Consideraciones
  3. Introducción a Node.js
  4. El core de Node.js
  5. NPM
  6. Promesas
  7. Aplicaciones Web
  8. Persistencia de Datos
  9. Aplicaciones en Tiempo Real
  10. Node.js en Producción

Consideraciones

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

<< regresar al temario

Unidad 1

Introducción a Node.js

<< regresar al temario

Introducción a Node.js

<< regresar al temario

¿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, Uber, 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!!!

<< regresar unidad 1

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

blocking
vs
non 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...
'); $fichero_url = fopen('archivo.txt', 'r'); $texto = ''; while ( $trozo = fgets($fichero_url) ) { $texto .= $trozo; } printf($texto); printf('
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)

<< regresar unidad 1

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
  • ...

<< regresar unidad 1

io.js

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

¿Por qué io.js?

io.js

Fué lidereado por los contribuyentes más activos de Node.js y el CEO de NPM

Su objetivo fue arreglar de lo que carecía 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
  • Comienzó 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

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

La 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

Que consta de 2 partes:

  1. Un consejo de fundación encargado de la parte legal, marca, mercadotecnia y fondos
  2. Un comite técnico que actué de forma independiente y permita el crecimiento del ecosistema JS en el servidor

Al proceso se le llamó Node Convergence dando como resultado Node 4

¿Por qué saltaron de la versión 0.12.X a la 4.0.0?

Desde el surgimiento de io.js se fueron liberando versiones semanales hasta llegar a la 3.3.X

En consideración a esta evolución y al fuerte compromiso de la comunidad activa que se matuvo viva y fuerte por hacer crecer el ecosistema de JavaScript en el servidor, se decide relanzar Node en la versión 4.0.0

Cronología de Node 4

  • Ene 15: Se libera io.js.
  • Feb 15: Se anuncia la Fundación Node.js.
  • Mar 15: Se distribuyen las normas de la Fundación.
  • May 15: io.js entra a la Fundación.
  • Jun 15: Lanzamiento oficial de la Fundación.
  • Jul 15: Se establece el comité directivo.
  • Ago 15: Primer cumbre de colaboración en SFO.
  • Sep 15: Se libre de forma estable Node versión 4.0.0.
  • Dic 15: La dominación del mundo
    }:)

+ info

Una cosa más...

JS es el futuro de la web

):D
/

BE Node.js

<< regresar unidad 1

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:

<< regresar unidad 1

Unidad 2

El core de Node.js

<< regresar al temario

El núcleo de Node.js esta formado por poco más de 35 módulos

Es importante revisar su nivel de estabilidad al usarlos:

  • 0 - Deprecated
  • 1 - Experimental
  • 2 - Stable
  • 3 - Locked

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

Algunos Módulos:

Más core

Más módulos:

Otras cosas que podemos hacer:

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

<< regresar unidad 2

Unidad 3

NPM

<< regresar al temario

Node Package Manager

Es el gestor de paquetes de Node.js...

y de todo JavaScript

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

Documentación NPM

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

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

<< regresar al temario

Promesas

<< regresar al temario

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

Aplicando Promesas

<< regresar al temario

Unidad 4

Aplicaciones Web con Node.js

<< regresar al temario

Aplicaciones Web con Node.js

<< regresar al temario

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

<< regresar unidad 4

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

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

<< regresar unidad 4

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

<< regresar unidad 4

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

<< regresar unidad 4

Unidad 5

Persistencia de Datos

<< regresar al temario

Persistencia de Datos con Node.js

<< regresar al temario

Aplicaciones REST


VS


Aplicaciones CRUD

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).

<< regresar unidad 5

Gestores SQL


VS


Gestores NoSQL

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:

BD Documental
BD Transaccional
(NO SQL - BSON)
(SQL)
Colecciones y Documentos
Tablas y Registros

<< regresar unidad 5

API CRUD MySQL:

<< regresar unidad 5

API REST MySQL:

  • express-method-override
    (Para implementar verbos HTTP en nuestra API RESTful)
  • Implementación del Patrón MVC en Express.js

<< regresar unidad 5

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:

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 \
}=)
/

<< regresar unidad 5

API REST MongoDB:

<< regresar unidad 5

Unidad 6

Aplicaciones en Tiempo Real

<< regresar al temario

Aplicaciones en Tiempo Real

<< regresar al temario

¿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"

<< regresar unidad 6

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
/

<< regresar unidad 6

Chat con Node.js

Vamos a crear un chat con:

  • Express
  • Socket.IO

Y después...

<< regresar unidad 6

Streaming de Video:

Considerar las siguientes API's:

Let's to Stream! \
XD
/

<< regresar unidad 6

Unidad 7

Node.js en Producción

<< regresar al temario

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
/

Muchas Gracias
\
=D
/

¡Hasta la próxima!

@jonmircha / j@bextlan.com

<< inicio