El stack MEAN (Mongo+Express+AngularJS+Node.js) de JavaScript con tecnología de Microsoft

JavaScript se ha convertido en un lenguaje lo suficientemente maduro para que, no solo se pueda usar para validar formularios HTML en un navegador, sino que es una tecnología que permite crear aplicaciones en cliente y en servidor de forma muy potente.

En este artículo se va a repasar la pila de MEAN de JavaScript que se refiere a: Mongo+Express+AngularJS+Node.js salvo que en vez de utilizar Mongo como almacén de datos se va a utilizar DocumentDB el servicio de almacenamiento de Documento basado en JSON como servicio que se ofrece en Azure. Y en vez de programar JavaScript directamente se va a utilizar TypeScript un lenguaje open source por parte de Microsoft que es un subset de JavaScript permitiendo utilizar orientación a objetos a la hora de escribir el código.

Así que al final se va a tener DEANT que sería DocumentDB+Express+Angular+Node.js+TypeScript

clip_image002[1]

Node.js Tools for Visual Studio

Antes de comenzar con el artículo merece la pena recordar que Microsoft ofrece de manera gratuita para los desarrolladores de Node.js un plugin que se integra con Visual Studio 2012 y 2013 que permite crear aplicaciones en Node.js con soporte de depuración, Intellisense, profiling y demás integraciones con Visual Studio.

Para más información en este artículo de MSDN España: https://blogs.msdn.com/b/esmsdn/archive/2014/09/11/c-243-mo-desarrollar-aplicaciones-de-node-js-en-visual-studio.aspx

Backend del stack DEANT

Por la parte de servidor se va a utilizar los siguientes componentes Express, DocumentDB y Node.js

Express

Express.js es un framework web para crear aplicaciones web con Node.js, se puede descargar desde https://expressjs.com/ o utilizando el comando npm install express

Este framework es muy ligero y no oculta ninguna de las características que hacen interesante a Node.js, pero permite utilizar un sistema de plantillas para generar las vistas de las diferentes rutas, se apoya en Jade, otro framework para la generación de vistas basadas en fichero .jade

clip_image004[1]

clip_image006[1]

DocumentDB

DocumentDB es la base de datos basada en documentos sin esquema, ofrecida como servicio en Azure. Estas son lagunas de las características que ofrece el servicio:

  • Consultas Ad hoc con una sintaxis familiar de SQL: Se puede almacenar documentos JSON heterogéneos dentro del servicio y luego tener la posibilidad de hacer consultas de esos documentos usando un lenguaje SQL. DocumentDB utiliza un sistema de indexación altamente concurrente, libre de bloqueos y estructurado que permite automáticamente indexar todo el contenido del documento sin importar el esquema del mismo.
  • Ejecución de JavaScript dentro de la base de datos: Procedimientos almacenados, disparadores (triggers) y funciones definidas por el usuario (UDFs) se pueden definir utilizando JavaScript, eso permite tener la posibilidad de escribir toda la lógica de tu aplicación directamente usando JSON sin tener que tener problemas de esquemas. DocumentDB es una base de datos completamente transaccional utilizando JavaScript, permitiendo así que las operaciones CRUD de INSERT, REPLACE, DELETE y SELECT se ejecuten como transacciones aisladas.
  • Niveles de consistencia configurables: Se puede elegir un nivel de consistencia en el servicio, para balancear entre consistencia y rendimiento de datos. Para consultas y operaciones de lectura DocumentDB ofrece cuatro niveles de consistencia: Strong, Bounded-Stateness, Session y Eventual.
  • Completamente administrado: Se elimina la necesidad de administrar la base de datos y los recursos de la maquina en la que se ofrece el servicio. Como servicio completamente administrado en Azure, no hay necesidad de administrar máquinas virtuales, desplegar y configurar el software o tener que lidiar con complejas actualizaciones del servicio. Todo funciona directamente.
  • Almacenamiento y throughput escalable y elástico: Escala fácilmente los recursos disponibles de DocumentDB para que cumpla con las exigencias de tu aplicación.
  • Abierto por diseño: Empieza a utilizar DocumentDB directamente sin necesidad de adquirir nuevos conocimientos. DocumentDB utiliza una API RESTful con JSON para comunicarse y no hay necesidad de crear conexiones contra la base de datos.

Recursos de Azure DocumentDB

DocumentDB maneja el acceso a los diferentes recursos a través de recursos bien definidos como tramos de la URL.

El nivel jerárquico más alto es la cuenta, de la cual aparece una colección de base de datos. Para cada base de datos hay dos recursos, usuarios y colecciones de documentos.

Los usuarios es un mecanismo que tiene DocumentDB para generar usuarios que puedan acceder a determinadas colecciones dentro de la base de datos.

Las colecciones representan los documentos JSON que están alojados dentro de la base de datos, pero los documentos pertenecientes a la misma colección no tienen por qué tener el mismo esquema, es decir, que puede ser de cualquier manera.

Dentro de cada uno de los documentos JSON aparece una sección llamada adjuntos, que como su nombre aclara, sirve para gestionar los binarios adjuntos a ese documento en concreto. La parte interesante de esta gestión de archivos adjuntos por cada documento, es que estos binarios son almacenados en una cuenta de Azure Storage, así que el usuario no tiene que añadir una capa de complejidad mayor para gestionar estos adjuntos.

Las tres últimas secciones son procedimientos, disparadores y funciones definidas por el usuario.

DocumentDB Node.js API

Para empezar a trabajar con DocumentDB desde Node.js hay que instalar el paquete documentdb, además para gestionar la configuración de acceso a la base de datos se utiliza el paquete nconf.

 
var DocumentDBClient = require('documentdb').DocumentClient;
var nconf = require('nconf');
// tell nconf which config file to use
nconf.env();
nconf.file({ file: 'config.json' });
var host = nconf.get("HOST");
var authKey = nconf.get("AUTH_KEY");
var databaseId = nconf.get("DATABASE");
var collectionId = nconf.get("COLLECTION");
// create an instance of the DocumentDB client
var client = new DocumentDBClient(host, { masterKey: authKey });

 

TypeScript

Otro de los elementos que aparece en el diagrama de la aplicación es TypeScript. Este lenguaje, junto con las definiciones de lenguaje permite al desarrollador, utilizar frameworks de terceros como, jQuery y AnguarJS directamente en TypeScript, como si estuvieran escritos en el mismo lenguaje. En nuget hay una lista con las definiciones de los lenguajes que se están disponibles para poder utilizar TypeScript.

https://www.nuget.org/profiles/DefinitelyTyped

clip_image008

Ese paquete de nuget lo que descarga es un fichero con extensión .d.ts que son las definiciones para poder usarlas dentro de otros ficheros TypeScript.

clip_image009

Para poder acceder a esas definiciones dentro de cualquier otro fichero de TypeScript hay que incluir esta referencia al principio del fichero:

/// <reference path="../scripts/typings/jquery/jquery.d.ts" />

/// <reference path="../scripts/typings/angularjs/angular.d.ts" />

Así de esa manera se tiene acceso a las definiones de lenguaje de jQuery y AngularJS.

Por ejemplo, en esta clase, se ha definido un método para poder hacer llamadas a un servicio web usando el objeto JQueryAjaxSettings de jQuery, directamente desde código de TypeScript.

clip_image011

Conlusión

Hoy en día Visual Studio es lo suficientemente flexible como para poder trabajar con diferentes tipos de frameworks y tecnologías con un soporte fantástico. Además si eres desarrollador de JavaScript puedes desarrollar aplicaciones utilizando este lenguaje tanto en cliente como en servidor de una manera muy cómoda.

Además todo esto si quieres rizar el rizo, se puede programar la parte de servidor con Node.js con TypeScript también, haciendo que la parte de servidor la programes en este lenguaje y el resultado del fichero de TypeScript sea JavaScript que el intérprete de Node.js ejecute.

Por supuesto en Visual Studio tiene soporte de esta característica, permitiéndote crear un proyecto de Node.js con TypeScript.

clip_image013

Luis Guerrero.

Technical Evangelists Microsoft Azure.

@guerrerotook