Junio 22, 2014 Uncategorized

Desarollo de un API REST con Sails.js

En el artículo anterior explicamos cómo desarrollar un API REST con MongoDB, NodeJS y Express desde cero. Vimos que desarrollar un API desde cero es un proyecto sencillo aunque puede resultar tedioso. También hemos comentado en artículos anteriores que cuando tenemos que desarrollar un nuevo proyecto es muy importante conocer y analizar qué herramientas son las más apropiadas para su desarrollo y elegir aquéllas que mejor se adapten a las características de nuestro proyecto.

La productividad es un factor muy importante en el proceso de desarrollo de software. Por este motivo, teniendo en cuenta el factor productividad, en este artículo quiero introducir el framework Sails.js, que nos va a facilitar y a agilizar el proceso de desarrollo de un API REST.

 

Descripción de Sails.js

Según la propia página web oficial de Sails.js:

Sails.js facilita el desarrollo de aplicaciones Node.js empresariales. Ha sido diseñado para imitar el patrón MVC de frameworks como Ruby on Rails, pero con soporte para los requisitos de aplicaciones modernas: data-driven APIs con una arquitectura escalable y service-oriented. Es especialmente bueno para el desarrollo de chats, cuadros de mando en tiempo real o juegos multijugadores.

 

Una de las cosas que nos permite Sails.js, entre muchas otras, es el desarrollo de forma sencilla y rápida de un API REST. Por eso considero que puede ser una herramienta muy importante del stack de software que comentamos en el artículo desarrollo de aplicaciones web modernas.

 

Creación de un API con Sails.js

En este artículo iba a escribir varias secciones para explicar la creación de un API con Sails.js, pero como es un proceso tan sencillo y tan rápido voy a explicarlo en esta única sección. Ejecutando únicamente un par de instrucciones e insertando una única línea de código conseguimos desarrollar el mismo API que desarrollamos en el artículo desarrollo de un API REST con MongoDB, NodeJS y Express, pero con más funcionalidades:

Como vemos, en primer lugar generamos nuestro proyecto mediante el comando sails generate new MyApi –no-front-end y después generamos nuestro API para la entidad Message mediante el comando sails generate api message.

Finalmente tenemos que definir las propiedades de nuestra entidad, la cual se compone únicamente de la propiedad text. Por lo tanto, abrimos el fichero api/models/Message.js y definimos sus propiedades:

 

Base de Datos en Sails.js

Sails.js utiliza el ORM Waterline, que es desarrollado y mantenido por el mismo equipo de desarrollo de Sails.js.

Waterline dispone de adaptadores para conectarse a varias bases de datos (MySQL, PostgreSQL y MongoDB, entre otras). También podemos hacer que almacene los datos en disco o en memoria (no recomendado para producción), con lo cual podríamos probar nuestras aplicaciones sin necesidad de tener instalado un gestor de base de datos.

Por defecto, Sails.js está configurado para utilizar el local disk adapter (almacena los datos en un directorio temporal de nuestro sistema de ficheros). En el fichero config/connections.js están definidas nuestras conexiones a base de datos y en el fichero config/models.js se define qué conexión queremos que nuestras entidades utilicen por defecto. Cuando definimos cada una de nuestras entidades podemos especificar qué conexión queremos que utilice. Si no especificamos ninguna entonces Sails.js utilizará aquella que esté definida en config/models.js.

 

Probando el API

Para probar nuestro API previamente tenemos que arrancar nuestra aplicación ejecutando la siguiente instrucción:

Una vez arrancado el servidor podemos utilizar la extensión POSTMAN de Chrome para hacer peticiones a nuestro API.

Si queremos obtener todos los mensajes, lanzaremos una petición GET a la URL http://localhost:1337/message:

blog-ch2-empty-collection

Si queremos agregar un nuevo mensaje, lanzaremos una petición POST a nuestro API:

blog-ch2-post

Y si nuevamente consultamos nuestros mensajes enviando una petición GET, obtenemos la siguiente información:

blog-ch2-collection

 

Relaciones entre Entidades con Sails.js

Otra característica que Sails.js incorpora al generar nuevas APIs y que supondría bastante trabajo si tuviéramos que desarrollarlo manualmente es la gestión de relaciones entre entidades.

Para explicar las relaciones entre entidades vamos a utilizar el ejemplo que utiliza el equipo de Sails.js en su propia documentación. El ejemplo que vamos a ver se basa en una relación uno a muchos, en el que las entidades van a ser Pet y User y donde un usuario va a poder tener un número indefinido de mascotas.

En primer lugar, generamos nuestro API para la entidad Pet:

Y la definimos tal y como lo hacen en la documentación de Sails.js:

A continuación creamos nuestro API para la entidad User:

Y la definimos con las siguientes propiedades:

Arrancamos nuestra aplicación ejecutando la instrucción sails lift y probamos nuestro API con POSTMAN lanzando las siguientes peticiones a nuestro servidor:

Petición POST para crear un usuario

blog-ch2-rel-insert-user

 

Petición GET para obtener una lista de usuarios

blog-ch2-rel-list-users-pets-empty

Petición POST para crear una mascota

blog-ch2-rel-insert-pet

 

Cuando creamos una nueva mascota introducimos el código del usuario al que pertenece la mascota.

Petición GET para obtener una lista de usuarios

blog-ch2-rel-list-users-with-pets

Automáticamente nuestro API nos devuelve las mascotas asociadas a cada usuario.

Petición GET para obtener un usuario

blog-ch2-rel-list-one-user-with-pets

Petición GET para obtener una mascota de un usuario

blog-ch2-rel-list-one-user-one-pet

Si nos fijamos en la URL vemos cómo relacionamos las entidades para obtener la mascota con el ID igual a 1 del usuario con ID igual a 1.

 

Conclusión

En este artículo hemos visto que el desarrollo de un API REST con Sails.js es muy sencillo y muy rápido. Simplemente ejecutando un par de instrucciones de Sails.js podemos crear la estructura de nuestra aplicación y un API. A partir ahí sólo tenemos que definir las propiedades de nuestras entidades y sus relaciones.

Además, Sails.js ofrece muchas más características de las que hemos visto en este artículo, como notificaciones en tiempo real, gestión de la seguridad y un ORM que nos permite trabajar indistintamente con varios gestores de bases de datos, entre muchas otras características.

Hemos podido comprobar cómo el hecho de seleccionar Sails.js en lugar de desarrollar un API desde cero como hicimos en el artículo anterior, ha ayudado a que obtengamos un notable aumento de productividad.

En siguientes artículos seguiremos viendo herramientas que pueden ayudarnos en el desarrollo de nuestros proyectos.

  1. Salim Castellanos dice:

    De antemano muchas gracias Jose Luis, estoy super enganchao con el mundo Node.js y Sails.js, tengo ganas de hacer un backend con Sails.js, para quien quiera empezar con Sails.js tenga un entorno donde ya este listo el registro, login, menus desde bd, perfiles, etc. Asi que tengo mucho que aprender, tal vez sea mucho pedir pero me encantaria un post sobre el manejo de Sessiones, e tratado de buscar informacion con ejemplos pero no he encontrado nada de utilidad para la version actual. 0.10.5. No se si tambien te animas con el proyecto.

    Saludos.

  2. jl_monteagudo dice:

    Hola Salim,

    Gracias por comentar. En principio me gustaría terminar esta serie de videos que he estado publicando. Después sí creo que podría ser interesante publicar una serie de vídeos donde migrar esta aplicación a Sails, aunque también tenía pensado hacer la versión mobile con el framework Ionic. Todavía no sé por dónde seguiré. Mientras tanto, podrías echarle un vistazo al plugin https://github.com/kasperisager/sails-generate-auth que permite gestionar la autenticación en Sails. Este plugin gestiona mucho menos de lo que tú exponías en tu comentario, pero te lo comento por si te sirve de ayuda.

    Saludos.

  3. Ander dice:

    Gran post, felicitaciones, estaba probando https://github.com/balderdashy/sailsChat para correrlo con mongo mas corre normal pero cuando trata de buscar el id del user me vota lo siguiente:
    Error in onDisconnect: [TypeError: Cannot read property ‘id’ of undefined], cualquier tipo de ayuda de antemano las gracias. Soy novato todavía en esto de sails agradezco sus recomendaciones-

  4. Eduardo dice:

    Como estas ? Sabes si soporta SQL Server ??

    Por lo que veo, no ?

    Saludos
    Eduardo

  5. jl_monteagudo dice:

    Hola Eduardo,

    Si miras la documentación de Waterline, que es el ORM que utiliza SailsJS, verás que sí existe un adaptador para Microsoft SQL Server:

    https://github.com/balderdashy/waterline

    https://github.com/cnect/sails-sqlserver

    Saludos

  6. Patricia Hung dice:

    Hola Jose Luis, muy buen articulo, una pregunta tengo varias api corriendo en distintos servidores y me gustaría hacer una conexión de un api a otra, si me puedes ayudar me encantaría. quisiera que la conexión la pueda lograr mediante la implementación de un servicio

  7. Ariel dice:

    Muchas gracias por el tutorial, muy bueno para dar una idea general del framwork!

  8. ignacio Huitzil dice:

    Saludos muy buen aporte, e iniciado a trabajar con este framework de forma educativa y de negocio e trabajado por el momento con modelos muy pequeños. Mi duda es como se representaría en el modelo una relación muchos a muchos e igual no se si la relación uno a uno se maneje de la misma forma como en la de este tutorial.

  9. jackBrown dice:

    me gusto mucho el tutorial, ahora mismo voy a ponerme a probar todo
    gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Back to top