REST API con Sails – Adaptadores y MongoDB

Información de prueba

curl -is -X POST -d "username=josoroma&email=josoroma@example.com" http://localhost:1337/user

curl -is -X POST -d "username=celine&email=celine@example.com" http://localhost:1337/user

curl -is -X POST -d "username=uifi&email=uifi@example.com" http://localhost:1337/user/create

curl -is -X POST -d "username=coco&email=coco@example.com" http://localhost:1337/user/create
curl -is -X GET http://localhost:1337/user

curl -is http://localhost:1337/user

Generar REST API de ubicación

cd places

sails generate api location

sails lift

Listar

curl -is http://localhost:1337/location

Obtener un Registro desde el Browser

http://localhost:1337/user?where={"username":{"contains":"josoroma"}}

Por favor consulte: Find

Instalar MongoDB

brew install mongodb
lsof -iTCP -sTCP:LISTEN | grep mongo

mongod    337 user   11u  IPv4 0xfbda8d570c57142b      0t0  TCP localhost:27017 (LISTEN)
ps aux | grep '[m]ongo'

user          337   0.0  0.4  2718292  34692   ??  S     2:21PM   0:18.24 /usr/local/opt/mongodb/bin/mongod --config /usr/local/etc/mongod.conf
cat /usr/local/etc/mongod.conf

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1

Por favor consulte: Install MongoDB on OS-X

Instalar el adaptador MongoDB para nuestra aplicación

cd places

npm install -g sails-mongo --save

sails-mongo asocia/mapea el atributo lógico id con el _id de la capa física del Mongo id. En la versión actual de sails-mongo, no se debe ordenar por id.

Por favor consulte: sails-mongo

config/connections.js

mongo: {
  adapter: 'sails-mongo',
  host: '127.0.0.1',
  port: 27017,
  user: '',
  password: '',
  database: 'places'
},

Por favor consulte: Default MongoDB Port

lsof -iTCP -sTCP:LISTEN | egrep ':2701[7..9]'

mongod    337 user   11u  IPv4 0xfbda8c570c57143b      0t0  TCP localhost:27017 (LISTEN)

config/models.js

// Sails-Mongo Connection.
connection: 'mongo',

// Development Mode.
migrate: 'drop'

Lift

cd places

sails lift

Mongo desde la consola

mongo

Listar las Bases de Datos:

show dbs

admin   (empty)
local   0.078GB
places  0.078GB

Usar la Base de Datos llamada places:

use places

switched to db places

Listar las colecciones de la Base de Datos places:

show collections

location
system.indexes
user

Listar todos los documentos de la colección user:

db.user.find().pretty();

Por favor consulte:

REST API con Sails – Apps y CRUD

Crear una nueva App

sails generate new {pluralApplicationName}

sails new places

cd places

atom

Correr la aplicación Sails

Correr la aplicación Sails desde el directorio actual (si el archivo node_modules/sails existe, se utiliza en lugar del Sails instalado globalmente).

sails lift

Por favor consulte: sails lift

sails new {pluralApplicationName} es un alias que corre sails generate new {pluralApplicationName}.

Generar REST API de Usuario

cd {pluralApplicationName}

cd places

sails generate api {singularRestApiName}

sails generate api user

sails lift

Comprobar que el REST-API responde bien

curl -s http://localhost:1337/user

[]

Genera:

  • api/models/User.js
  • api/controllers/UserController.js

Configurar config/models.js

Por favor consulte: Migrate

  • sails.config.models.migrate=”alter”
  • migrate: ‘alter’

Esta opción controla si Sails intentará automáticamente reconstruir las Tablas/Colecciones/Conjuntos/etc. en el esquema de la Base de Datos.

En producción (NODE_ENV === “production”)

Sails utiliza siempre migrate: ‘safe’ para proteger el borrado accidental de datos. Sin embargo, durante el desarrollo, existen otras opciones interesantes:

  • safe – nunca auto-migra las bases de datos. Es como decir: Voy a hacerlo yo mismo (a mano).
  • alter – auto-migra, pero tratando de mantener los datos existentes (experimental).
  • drop – limpia todos los datos y reconstruye los modelos cada vez que se corre sails lift.

Generadores

Sails viene con varios generadores para ayudar a realizar los andamios de nuevas aplicaciones. También es permite que cualquiera pueda crear sus propios generadores para manejar tareas frecuentes, o ampliar la funcionalidad (por ejemplo, mediante la creación de un generador que da salida a archivos de vista de su lenguaje de plantillas favorito).

Por favor consulte: Generate

Configurar config/connections.js

Los adaptadores:

  • Son el intermediario entre nuestra aplicación Sails y algún tipo de almacenamiento (generalmente una base de datos).
  • Se configuran en el archivo config/connections.js de la aplicación. En este archivo se pueden crear diferentes “ajustes guardados” globales que se pueden mezclar y combinar desde los modelos.
  • Existen adaptadores en Sails para una variedad de bases de datos populares, tales como MySQL, Postgres y Mongo.

Por favor consulte: Blueprint API

Crear

curl -is -X POST -d "username=josoroma&email=josoroma@example.com" http://localhost:1337/user

curl -is -X POST -d "username=celine&email=celine@example.com" http://localhost:1337/user
HTTP/1.1 200 OK

{
  "username": "josoroma",
  "email": "josoroma@example.com",
  "createdAt": "2014-11-23T18:11:44.350Z",
  "updatedAt": "2014-11-23T18:11:44.350Z",
  "id": 1
}
{
  "username": "celine",
  "email": "celine@example.com",
  "createdAt": "2014-11-23T18:11:45.337Z",
  "updatedAt": "2014-11-23T18:11:45.337Z",
  "id": 2
}
curl -is -X POST -d "username=uifi&email=uifi@example.com" http://localhost:1337/user/create

curl -is -X POST -d "username=coco&email=coco@example.com" http://localhost:1337/user/create
 HTTP/1.1 200 OK

{
  "username": "uifi",
  "email": "uifi@example.com",
  "createdAt": "2014-11-23T18:12:14.281Z",
  "updatedAt": "2014-11-23T18:12:14.281Z",
  "id": 3
}
{
  "username": "coco",
  "email": "coco@example.com",
  "createdAt": "2014-11-23T18:12:15.118Z",
  "updatedAt": "2014-11-23T18:12:15.118Z",
  "id": 4
}

Listar

curl -is http://localhost:1337/user

curl -is http://localhost:1337/user/find

HTTP/1.1 200 OK

[
  {
    "username": "josoroma",
    "email": "josoroma@example.com",
    "createdAt": "2014-11-23T18:11:44.350Z",
    "updatedAt": "2014-11-23T18:11:44.350Z",
    "id": 1
  },
  {
    "username": "celine",
    "email": "celine@example.com",
    "createdAt": "2014-11-23T18:11:45.337Z",
    "updatedAt": "2014-11-23T18:11:45.337Z",
    "id": 2
  },
  {
    "username": "uifi",
    "email": "uifi@example.com",
    "createdAt": "2014-11-23T18:12:14.281Z",
    "updatedAt": "2014-11-23T18:12:14.281Z",
    "id": 3
  },
  {
    "username": "coco",
    "email": "coco@example.com",
    "createdAt": "2014-11-23T18:12:15.118Z",
    "updatedAt": "2014-11-23T18:12:15.118Z",
    "id": 4
  }
]

Un Registro

curl -is http://localhost:1337/user/find/1

curl -is -d "id=1" http://localhost:1337/user/find

curl -is -d "username=josoroma" http://localhost:1337/user/find

HTTP/1.1 200 OK

{
  "username": "josoroma",
  "email": "josoroma@example.com",
  "createdAt": "2014-11-23T18:11:44.350Z",
  "updatedAt": "2014-11-23T18:11:44.350Z",
  "id": 1
}

Actualizar

curl -is -X PATCH -d "username=josepablo"  http://localhost:1337/user/update/1

HTTP/1.1 200 OK

{
  "username": "josepablo",
  "email": "josoroma@example.com",
  "createdAt": "2014-11-23T18:11:44.350Z",
  "updatedAt": "2014-11-23T18:17:07.673Z",
  "id": 1
}
curl -is -X PUT -d "username=josoroma&email=example@josoroma.com"  http://localhost:1337/user/update/1

HTTP/1.1 200 OK

{
  "username": "josoroma",
  "email": "example@josoroma.com",
  "createdAt": "2014-11-23T18:11:44.350Z",
  "updatedAt": "2014-11-23T19:14:20.633Z",
  "id": 1
}

Borrar

curl -is -X DELETE http://localhost:1337/user/destroy/1

HTTP/1.1 200 OK

{
  "username": "josoroma",
  "email": "josoroma@example.com",
  "createdAt": "2014-11-23T18:11:44.350Z",
  "updatedAt": "2014-11-23T19:14:20.633Z",
  "id": 1
}
curl -is -X DELETE http://localhost:1337/user/destroy/1

HTTP/1.1 404 Not Found

No record found with the specified `id`.

Comprobar

curl -s http://localhost:1337/user

curl -is http://localhost:1337/user/find

HTTP/1.1 200 OK

[
  {
    "username": "celine",
    "email": "celine@example.com",
    "createdAt": "2014-11-23T18:11:45.337Z",
    "updatedAt": "2014-11-23T18:11:45.337Z",
    "id": 2
  },
  {
    "username": "uifi",
    "email": "uifi@example.com",
    "createdAt": "2014-11-23T18:12:14.281Z",
    "updatedAt": "2014-11-23T18:12:14.281Z",
    "id": 3
  },
  {
    "username": "coco",
    "email": "coco@example.com",
    "createdAt": "2014-11-23T18:12:15.118Z",
    "updatedAt": "2014-11-23T18:12:15.118Z",
    "id": 4
  }
]

SailsJS Baby Steps

¿Qué es Sails?

Sails permite que sea fácil construir aplicaciones Node.js empresariales (estables y fiables) a la medida. Está diseñado para emular el patrón MVC de “frameworks” bien conocidos como Ruby on Rails, CakePHP y Django, pero soportando los requisitos de aplicaciones modernas: APIs basados en datos con una arquitectura orientada en servicios escalables. Especialmente efectivo para la construcción de chats y tableros de control en tiempo real, también es ideal para la construcción de juegos multi-jugador; pero se puede utilizar para cualquier proyecto o aplicación Web.

Introducción a Sails

Estructura MVC

  • Facilita modelos agnósticos de almacenamiento.
  • Controladores basados en un “blueprint”.
    Los controladores son pegados (“middleware”) con Express (para gestionar y hablar HTTP).
    Por ejemplo, una petición HTTP entra al servidor Web y Express provee toda la funcionalidad para responder un adecuada respuesta HTTP.
  • Las vistas del lado del servidor se presentan o dibujan basadas en el controlador. Se enfatizan en entregar un API, generalmente en formato JSON (entrega contra un URL), pero también soporta la generación de otros tipos de vistas basadas en controladores.

Nota: En la industria de la computación, el “middleware” es un término general para cualquier programación que sirve para “pegar entre sí” o mediar entre dos programas separados y, a menudo ya existentes.

Plantillas del lado del servidor

EJS limpia el HTML producido por JavaScript con el uso de plantillas del lado del cliente. Después de que EJS pone sus guantes en el código sucio, te vas a sentir más organizado y ordenado.

Pero también se puede extender a usar Handlebars o Jade.

Object-relational mapping (ORM Layer)

Waterline es un nuevo tipo de motor de almacenamiento y recuperación.

Adaptadores Agnósticos

Proporciona un API uniforme para acceder a cosas de diferentes tipos de bases de datos, protocolos y APIs de terceros. Esto significa que usted escribe el mismo código para obtener y almacenar cosas como datos de los usuarios, ya sea que vivan en Redis, MySQL, LDAP, MongoDB o Postgres. También se “pega” bien con APIs remotos como Twitter. Esto que permite que cualquier módulo en nuestra aplicación puede soportar diferentes adaptadores adicionales.

Modularidad

Waterline se esfuerza en heredar las mejores partes de ORMs conocidos como ActiveRecord, Hibernate, y Mongoose (“Object Modeling for Node.js”), pero con una nueva perspectiva y énfasis en la modularidad, capacidad de prueba, y la coherencia entre los adaptadores.

Nota: El mapeo objeto-relacional (ORM, O/RM, y O/R mapeo) en ciencias de la computación es una técnica de programación para la conversión de datos entre sistemas de tipos incompatibles en los lenguajes de programación orientados a objetos. Esto crea, en efecto, una “base de datos de objeto virtual” que se puede utilizar desde dentro del lenguaje de programación.

Policies

Siguen una estructura muy simple, son un “Express Middleware Callback”. Por convención corren antes de llegar a cualquier acción del controlador o a alguna acción específica del controlador.

Algunos de sus usos permiten:

  • Decorar datos de sesión.
  • Autenticación.

Para más información:

Soporte en tiempo real con Socket.io (req, res y next)

Socket.IO permite una comunicación en tiempo real y bidireccional basada en eventos. Funciona en todas las plataformas, navegadores Web o dispositivos, centrándose también en la fiabilidad y la velocidad.

  • Magia interna (traducción de rutas) todos responden a través de “sockets” o “http”.
  • Unifica la lógica del negocio.
  • Se extiende para agregar (broadcast events and join channels) res.broadcast() y req.join() para soportar un pubsub básico.

API Blueprints

Una vez que se crea un modelo con Sails, este provee de manera automática todos los “CRUD Blueprints” básicos, incluyendo búsqueda, ordenamiento y paginación. Son como “rutas mágicas” disponibles que no necesitan ser definidas.

Grunt-based Asset Pipeline

Sails usa Grunt para el manejo de tareas.

  • Auto-compila CSS Processors (LESS y Sass), CoffeScipt, etc.
  • Los assets son automáticamente combinados e inyectados en el DOM.
  • Soporta los modos de Desarrollo y Producción.

Sails es fácil de extender

Adaptadores

Los adaptadores Waterline soportan fuentes SQL, NoSQL y WebServices.

Generadores

Se pueden producir generadores a la medida para hacer scaffold en nuestra aplicación (CLI).

Hooks (todo es un hook)

El core de Sails es muy flexible y se puede extender de manera fácil mediante hooks.

Creating a Web App from scratch

Node Baby Steps

¿Qué facilita y permite Node.js?

Node.js es una plataforma basada en el “Chrome’s JavaScript Runtime” que facilita la construcción agil de aplicaciones de red escalables. Node.js utiliza un modelo de E/S sin bloqueo por eventos que le permite ser ligero y eficiente, ideal para aplicaciones en tiempo real con datos intensivos que se ejecutan a través de dispositivos distribuidos.

Istalando Node.js en Yosemite

brew install node

Más información: Installing Homebrew on OS X Yosemite

Actualizar NPM

npm install npm -g

Más información: https://www.npmjs.org/doc/misc/npm-faq.html

Actualizar Node.js con NPM

sudo npm cache clean -f

sudo npm install -g n

sudo n stable

node -v

También es posible usar una versión en específico, por ejemplo:

sudo n {VERSION}

Ayuda rápida

npm -h

npm install -h

npm update -h

npm uninstall -h

Buscar (terriblemente lento)

npm search sails

Más información: