Eres un desarrollador de PHP. Lo entiendo. Yo también lo soy. Mi viaje a PHP no tomó el camino normal que la mayoría de los desarrolladores de PHP recorren en su búsqueda del lenguaje de programación perfecto. Inicialmente comencé como desarrollador Java y pasé aproximadamente 10 años viviendo en esa tierra. Yo era uno de esos desarrolladores Java duros que cuando PHP se introducía en una conversación, empezaba a soltar cosas como empresa, escalabilidad y otras tonterías.

Empecé a trabajar en un proyecto de código abierto que necesitaba un front-end de web social hace unos 5 años y el equipo necesitaba elegir un lenguaje de programación para el sitio. Exploré Java y la mayoría de los otros lenguajes pero me decidí por PHP por una serie de razones. Fue duro tragarme mi orgullo y empezar a programar en PHP, pero lo que ocurrió durante ese proyecto fue nada menos que un milagro. Me enamoré del lenguaje y empecé a utilizarlo en todos los proyectos que pude encontrar mientras dejaba de lado mis raíces en Java. PHP me ha servido bien durante los últimos 5 años, pero todavía estaba buscando ese santo grial de un lenguaje de programación que es rápido de desarrollar, tiene el respaldo de la empresa, es performante y escalable, mientras que también proporciona una fuerte comunidad de desarrolladores. Creo que Node.js satisface todos mis requisitos y, al mismo tiempo, es un lenguaje de rápido crecimiento y evolución.

Lo primero que hay que entender es que Node.js no es sólo para los desarrolladores hipsters o los primeros en adoptarlo. Está en uso por algunos de los sitios web con más tráfico en Internet hoy en día y sigue ganando los corazones y la mente de los desarrolladores. Está realmente en un punto en el que se puede confiar incluso en los sistemas más complicados.

Node.js es JavaScript##

Si estás pensando que necesitas aprender un lenguaje completamente nuevo para ser productivo con Node.js, probablemente estés equivocado. La mayoría de los desarrolladores ya están familiarizados con JavaScript y ese es el lenguaje y la semántica con la que trabajarás cuando codifiques en Node.js. De hecho, un reciente artículo publicado por Red Monk que trata de dar sentido a los proyectos de github para determinar los lenguajes más populares tiene a JavaScript como el rey. Los tres primeros lenguajes son los siguientes:

  • JavaScript
  • Java
  • PHP

Dada la popularidad de JavaScript y su amplia adopción en nuestra industria, si aún no estás familiarizado con él, probablemente sea el momento de abrocharte el cinturón y empezar a aprenderlo.

Si Node.js sólo utiliza JavaScript, ¿qué es exactamente?

En pocas palabras, Node.js es una plataforma para actividades del lado del servidor. Utiliza el lenguaje de programación Javascript y tiene una plétora de bibliotecas disponibles como módulos npm. Puedes pensar en estos módulos npm como dependencias de bibliotecas que pueden ser satisfechas con Composer si vienes de la tierra de PHP. De hecho, el sistema de gestión de dependencias por defecto para PHP (Composer) fue inspirado por Node.js según el sitio oficial. Lo más probable es que si necesita un poco de funcionalidad y no le apetece escribir todo el código usted mismo, hay un módulo npm disponible que ya proporciona las características que está buscando.

Las aplicaciones Node se implementan normalmente cuando se necesita maximizar la eficiencia mediante la utilización de E/S sin bloqueo y eventos asíncronos. Un inconveniente para los desarrolladores de PHP es que las aplicaciones Node.js se ejecutan en un solo hilo. Sin embargo, el código Node.js del backend utiliza múltiples hilos para operaciones como el acceso a la red y a los archivos. Teniendo en cuenta esto, Node es perfecto para aplicaciones en las que se desea una experiencia casi en tiempo real.

Comenzando con un proyecto de ejemplo##

Por el resto de esta entrada del blog, voy a mostrarte cómo ponerte al día con Node.js viniendo de un fondo de PHP. La aplicación de ejemplo que vamos a escribir es un simple servicio backend que proporcionará la ubicación de cada tienda Walmart. He elegido Walmart para este ejemplo porque, sencillamente, es el santo grial de todos los grandes almacenes. Si Walmart no lo tiene, no lo necesitas.

Al final de esta entrada de blog, verás lo rápido y fácil que es crear una API basada en REST usando Node.js que se alimenta de la popular base de datos MongoDB. Elegí este ejemplo basado en REST porque la creación de una API backend se ha convertido rápidamente en un caso de uso común en la mayoría de las aplicaciones modernas.

Originalmente había planeado crear la misma aplicación tanto en PHP como en Node.js para ayudar a facilitar la transición para usted, pero con el fin de cubrir todos los diferentes marcos y formas de crear servicios basados en REST en PHP, justificaría un libro entero y simplemente no puede ser cubierto en una sola entrada del blog. Entonces pensé en usar sólo el framework Laravel ya que sigue creciendo en popularidad. Sin embargo, sólo llegaría a una cuarta parte de los desarrolladores de PHP. Personalmente, mi framework favorito es CodeIgniter, pero está perdiendo terreno rápidamente y ahora sólo representa menos del 8% de la población de desarrolladores de PHP. Sitepoint publicó recientemente un artículo discutiendo esto mismo y proporciona el siguiente gráfico que representa los frameworks que muestran la mayor promesa para 2014.

Dadas las grandes diferencias en la forma de configurar las conexiones de base de datos y crear servicios REST para cada framework, voy a asumir que usted sabe cómo hacer esto para su framework en PHP y en su lugar se centrará sólo en el código de Node.js.

Creando nuestra aplicación Node.js##

Para el resto de este post, vamos a crear la aplicación del localizador de Walmart usando el framework LoopBack API de StrongLoop. Como un bono adicional, voy a caminar a través de la instalación de Node.js en OSX. Así que coge tu taza de café, siéntate, relájate y pongámonos a trabajar.

Paso 1: Instalar Node.js##

La forma más fácil de instalar Node.js es a través de uno de los paquetes binarios disponibles para la mayoría de los sistemas operativos. Dirija su navegador a la siguiente URL y descargue el correcto para su sistema operativo:

http://nodejs.org/download/

Una vez que esta página se cargue, debería ver lo siguiente:

Si está usando Mac OSX, haga clic en el archivo universal .pkg. Esto guardará el programa de instalación en su ordenador local. Una vez descargado el archivo, inicie el programa de instalación haciendo doble clic en el archivo .pkg que se ha descargado y se le presentará el cuadro de diálogo de instalación:

Complete el proceso de instalación utilizando todos los valores predeterminados y, finalmente, haga clic en el botón de cierre para salir del programa una vez que la instalación se haya realizado correctamente. Muy fácil, ¿no?

Paso 2: Instalar LoopBack con NPM

Ahora que tenemos Node.js instalado en nuestro sistema local, queremos instalar los paquetes de LoopBack que proporciona StrongLoop. LoopBack es un marco de trabajo de API de código abierto que proporciona funcionalidad que hará su vida más fácil a medida que comience a aprender a escribir y desplegar software escrito en Node.js.

Con el fin de instalar LoopBack, vamos a utilizar el comando npm que es parte del núcleo de la distribución de Node.js. NPM es el gestor de paquetes oficial para instalar librerías o módulos de los que dependen tus aplicaciones. Dado que este post está escrito para desarrolladores de PHP, una forma fácil de pensar en los módulos de NPM es relacionarlo con Composer. Usando el sistema de dependencias de Composer, los desarrolladores pueden especificar las dependencias en su archivo composer.json. Una vez que los paquetes han sido definidos en el archivo composer.json, un desarrollador de PHP simplemente necesita emitir el comando install que debería ser similar al siguiente:

$ php composer.phar install

Los módulos NPM funcionan de la misma manera y utilizan el archivo package.json para permitirle especificar dependencias para una aplicación en particular. También puedes instalar dependencias desde la línea de comandos para que estén disponibles en tu sistema local. No te preocupes si no entiendes esto todavía, ya que cubriremos el archivo package.json con más detalle en un paso posterior.

Para instalar LoopBack, podemos emitir un único comando que descargará e instalará todas las dependencias que necesitamos para el paquete. Abre tu ventana de terminal y emite el siguiente comando:

$ npm install -g strongloop

Nota: Puede que tengas que usar sudo dependiendo de tu instalación

¿Qué acaba de pasar? Le hemos dicho a npm que queremos instalar el paquete strongloop a la vez que proporcionamos la opción -g. La opción -g hace que el paquete esté disponible como un paquete global para que cualquiera en el sistema pueda utilizarlo y esté disponible para todas las aplicaciones. Una vez que ejecute el comando anterior, NPM descargará el paquete así como cualquier dependencia que se requiera. Dependiendo de la velocidad de tu sistema, esto puede tardar unos minutos en completarse.

Paso 3: Crear nuestra aplicación##

Crear una aplicación usando la API de LoopBack es muy fácil y sencillo. Simplemente abre tu ventana de terminal y emite el siguiente comando para crear una nueva aplicación llamada locatewalmart.

$ slc loopback _-----_ | | .--------------------------. |--(o)--| | Let's create a LoopBack | `---------´ | application! | ( _´U`_ ) '--------------------------' /___A___\ | ~ | __'.___.'__ ´ ` |° ´ Y ` Enter a directory name where to create the project: locatewalmart create locatewalmart/ info change the working directory to locatewalmart

La utilidad slccreará ahora un nuevo proyecto basado en LoopBack llamado locatewalmart y configurará el proyecto. Cuando se nos pida el nombre de la aplicación, podemos mantener el predeterminado.

What's the name of your application? locatewalmart

Después de ejecutar el comando anterior, se creará un nuevo directorio para su proyecto para su aplicación. Cambia al directorio de la aplicación con el comando cd:

$ cd locatewalmart

Ahora que tenemos nuestra aplicación creada, queremos añadir soporte para MongoDB como fuente de datos para el loopback.

Paso 4: Definir nuestro DataSource##

Para poder comunicarnos con MongoDB, necesitamos añadir una fuente de datos a nuestra aplicación. Lo hacemos ejecutando:

$ slc loopback:datasource mymongo Enter the data-source name: mymongo Select the connector for mymongo:PostgreSQL (supported by StrongLoop)Oracle (supported by StrongLoop)Microsoft SQL (supported by StrongLoop)❯ MongoDB (supported by StrongLoop)SOAP webservices (supported by StrongLoop)REST services (supported by StrongLoop)Neo4j (provided by community)(Move up and down to reveal more choices)

Paso 5: Apuntar al datasource##

Para comunicarnos con MongoDB, necesitamos apuntar el datasource a la instancia real de MongoDB. LoopBack define toda la configuración del datasource en el archivo datasource.json que se encuentra en el directorio root/server de tus aplicaciones. Abre este archivo y añade un datasource para MongoDB como se muestra en el siguiente código:

{ "db": { "name": "db", "connector": "memory" }, "mymongo": { "name": "mymongo", "connector": "mongodb" "url": "mongodb://localhost:27017/locatewalmart" }}

Nota: Asegúrate de proporcionar la URL de conexión correcta para tu base de datos MongoDB. Para este ejemplo, tengo una base de datos creada localmente llamada locatewalmart que quiero usar para mi fuente de datos.

Ahora que tenemos nuestra base de datos definida, hay un par de cosas extra que necesitamos hacer. En primer lugar tenemos que especificar que nuestras aplicaciones dependen del paquete loopback-connector-mongodb. Para especificar una dependencia, se modifica el archivo package.json que es similar a la edición del archivo composer.json en PHP. Abre el archivo package.json que se encuentra en el directorio raíz de tu aplicación y añade el loopback-connector-mongodb a la sección de dependencia. Después de eso puedes ejecutar npm install.

Alternativamente puedes simplemente ejecutar:

$ npm install loopback-connector-mongodb --save

Esto auto actualizará el package.json. La sección debería ser como la siguiente:

"dependencies": { "compression": "^1.0.3", "errorhandler": "^1.1.1", "loopback": "^2.0.0", "loopback-boot": "^2.0.0", "loopback-connector-mongodb": "^1.4.1", "loopback-datasource-juggler": "^2.0.0", "serve-favicon": "^2.0.1" }

Paso 6: Importar los datos a MongoDB##

Ahora que tenemos nuestro datasource configurado, necesitamos cargar el conjunto de datos en nuestra base de datos MongoDB.

Lo primero que queremos hacer es descargar un archivo JSON que tenga todos los datos que queremos devolver. Usted puede agarrar esto en la siguiente URL:

https://dl.dropboxusercontent.com/u/72466829/walmart.json

Una vez que tenga el conjunto de datos descargados, simplemente importarlo en su base de datos utilizando el comando mongoimport como se muestra a continuación:

$ mongoimport --jsonArray -d locatewalmart -c store --type json --file walmart.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword

Usted debe ver los siguientes resultados:

connected to: 127.0.0.12014-08-17T13:07:26.301-0400 check 9 31762014-08-17T13:07:26.305-0400 imported 3176 objects

Paso 7: Crear nuestro modelo de Tienda##

Se puede pensar en un modelo en los mismos términos en los que se piensa en los modelos en la tierra de PHP si se utiliza un framework MVC. Es una representación de un Objeto que en este caso es una tienda Walmart. LoopBack proporciona una forma conveniente de crear objetos modelo utilizando la línea de comandos. Abre tu ventana de terminal, ve a la carpeta del proyecto y emite el siguiente comando:

$ slc loopback:model

Esto iniciará una sesión interactiva donde podrás definir tu modelo. Lo primero que se te pedirá es la fuente de datos a la que quieres asociar el modelo. Seleccionaremos el datasource mymongo que acabamos de crear antes. A continuación nos pedirá el nombre plural del modelo. Utilizaremos el que viene por defecto (stores) y pulsaremos enter.

 Enter the model name: store Select the data-source to attach store to:db (memory)❯ mymongo (mongodb) Expose store via the REST API? Yes Custom plural form (used to build REST URL):

Una vez que pulsemos la tecla enter, se nos pedirá que especifiquemos las propiedades del modelo store. Puedes pensar en esto como var(s) que defines en una clase en PHP.

Enter an empty property name when done. Property name:

Las propiedades que queremos añadir son el tipo de tienda, la fecha de apertura, la latitud y la longitud.

 Property name: opendate invoke loopback:property

Una vez que pulses enter, se te pedirá que proporciones el tipo de datos para cada propiedad especificada. El primer elemento será opendate y queremos seleccionar que sea de tipo fecha. Seleccionamos fecha y pulsamos la tecla enter.

 Property type: string number boolean object array❯ date buffer geopoint (other)

A continuación nos preguntará si queremos que esta propiedad sea obligatoria para la validación del esquema. Introduciremos «sí».

 Required? (y/N) : y

A continuación se le pedirá el tipo de datos para cada una de las propiedades restantes. Proporcione las siguientes respuestas:

 Property name: type_store invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: latitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: longitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : y

Escriba «sí» y pulse la tecla intro.

¡Felicidades! acaba de crear su primer objeto modelo utilizando LoopBack junto con Node.js. Para ver lo que realmente se ha creado bajo cuerda, abre el archivo store.json que se encuentra en el directorio root/common/models de tu directorio de aplicaciones. Busca la entrada stores que tendrá el siguiente aspecto:

{ "name": "store", "base": "PersistedModel", "properties": { "opendate": { "type": "date", "required": true }, "type_store": { "type": "string", "required": true }, "latitude": { "type": "string", "required": true }, "longitude": { "type": "string", "required": true } }, "validations": , "relations": {}, "acls": , "methods": }

Como puedes ver, tenemos un modelo creado y las propiedades que hemos definido están asignadas al modelo store. El campo public especifica que queremos exponer este modelo al mundo a través de un servicio web REST.

El mapeo del modelo al datasource se define en el model-config.json bajo la carpeta raíz/servidor de la app. El campo datasource especifica la fuente de datos que este modelo utilizará para las operaciones CRUD.

"store": { "dataSource": "mymongo", "public": true }

Paso 8: Probar la API basada en REST##

¿Adivina qué? Acabas de crear tu primer servicio web basado en REST usando Node.js. No ha estado tan mal, ¿verdad? Vamos a comprobarlo apuntando nuestro navegador a la aplicación que acabamos de crear. Puedes hacerlo yendo a la siguiente URL:

http://0.0.0.0:3000/api/stores/

Se te presentará una representación JSON de todas las tiendas Walmart que hemos importado a la base de datos como se muestra en la siguiente imagen:

Usando el explorador de StrongLoop##

Bueno, eso es genial. Tenemos un endpoint REST que nos devolverá todos los almacenes Walmart de la base de datos, pero parece que las cosas siguen faltando un poco, ya que no tenemos una interfaz de gestión para trabajar con los datos o para verificar que todas las operaciones CRUD están funcionando. Afortunadamente, StrongLoop proporciona un práctico navegador que te permitirá explorar todos los endpoints que tiene tu aplicación. Para probarlo, abra su navegador y vaya a la siguiente URL:

http://0.0.0.0:3000/explorer/

Una vez cargada la página del explorador, expanda la API stores para ver todas las operaciones disponibles que se permiten sobre el objeto modelo. Esto se muestra en la siguiente imagen:

Como ejemplo de lo que puede hacer con el Explorador, expanda la API /stores/findOne y haga clic en el enlace Try it out! que consultará la base de datos y devolverá un registro como se muestra en la siguiente imagen:

Llevando las cosas un poco más allá añadiendo una representación de mapa##

Impresionante, hemos creado un endpoint basado en REST que devolverá una lista de todas las tiendas Walmart de nuestra base de datos. Para ilustrar aún más la velocidad con la que se pueden desarrollar aplicaciones completas con StrongLoop, vamos a construir un front end responsivo que contenga un mapa con chinchetas para cada tienda Walmart.

Paso 1: Crear el directorio público##

Por defecto, como se especifica en el archivo app.js del proyecto, cualquier archivo en el directorio público ubicado en el directorio raíz de las aplicaciones será servido al solicitante. Sin embargo, este directorio puede no existir por defecto, por lo que debemos crearlo. Abre tu terminal y cambia al directorio raíz de tu aplicación y emite el siguiente comando:

$ mkdir public

Paso 2: Crear el mapa responsivo##

Lo siguiente que tenemos que hacer es crear una bonita representación de los datos. Ya que tenemos la latitud y longitud de cada tienda, sería genial expresar este contenido con un mapa que el usuario pueda arrastrar, acercar y alejar, etc. Esta tarea es en realidad mucho más fácil de lo que se podría esperar si aprovechamos algunas bibliotecas existentes. Al finalizar la creación de esta vista responsiva, el resultado será como el siguiente:

Además, el usuario podrá hacer zoom a un nivel muy detallado del mapa para ver el Walmart más cercano como se muestra en la siguiente imagen:

El código de la vista web de la aplicación aprovecha las propiedades de longitud y latitud que definimos en nuestro objeto modelo y que importamos a la base de datos. También utilizaremos la popular librería Leaflet para crear el mapa y colocar los pines, o marcadores, en el mapa.

Para crear este mapa, crea un nuevo archivo en el directorio público llamado locatewalmart.html y añade el siguiente código JavaScript:

<!doctype html><html lang="en"><head> <title>Walmart Stores</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.css" /><!--> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.ie.css" /><!--><script src="https://code.jquery.com/jquery-2.0.0.min.js"></script><link href='http://fonts.googleapis.com/css?family=oswald' rel='stylesheet' type='text/css'><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><style type="text/css">body { padding: 0; margin: 0;}html, body, #map { height: 100%; font-family: 'oswald';}.leaflet-container .leaflet-control-zoom { margin-left: 13px; margin-top: 70px;}#map { z-index: 1;}#title { z-index: 2; position: absolute; left: 10px; }</style></head><body><h1>Walmart Stores</h1><div></div><script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script><script>center = new L.LatLng(39.83, -98.58);zoom = 5;var map = L.map('map').setView(center, zoom);var markerLayerGroup = L.layerGroup().addTo(map);L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18,attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);function getPins(e){url = "http://0.0.0.0:3000/api/stores";$.get(url, pinTheMap, "json")}function pinTheMap(data){//clear the current pinsmap.removeLayer(markerLayerGroup);//add the new pinsvar markerArray = ;var lastNumber = 0;for (var i = 0; i < data.length; i++){store = data;if(store.latitude.length > 0 && store.longitude.length>0) {markerArray.push(L.marker());}}markerLayerGroup = L.layerGroup(markerArray).addTo(map);}map.whenReady(getPins)</script></body></html>

Como puedes ver, el código es simplemente HTML y JavaScript estándar. La parte interesante es la función getPins(e) donde hacemos una llamada REST a la API que creamos anteriormente en esta entrada del blog. Luego iteramos sobre cada tienda y creamos un pin dado la latitud y longitud de cada tienda. Bastante ingenioso, ¿eh?

Conclusión##

En esta entrada del blog te mostré cómo crear un servicio web basado en REST que devuelve una lista de tiendas Walmart en los Estados Unidos. Después de crear el servicio web usando Loopback, añadimos una representación frontal de los datos. Con muy poco trabajo, fuimos capaces de desarrollar una aplicación completamente funcional mucho más rápido de lo que uno podría ser capaz con su lenguaje actual de elección. También discutimos algunas de las similitudes entre Node.js y PHP. Aunque todavía considero que PHP es un gran lenguaje, personalmente he encontrado que Node.js es un gran lenguaje siguiente para aprender dado el rico ecosistema de bibliotecas y la velocidad con la que soy capaz de crear aplicaciones.

He incluido una tabla rápida que puedes consultar al comparar Node.js con PHP.

Característica

PHP

Node.js

Gran IDE

Sí, múltiples opciones con IntelliJ, Zend Studio, Netbeans, etc

Sí, múltiples opciones con Eclipse, Visual Studio, Codenvy, etc

Gestión de dependencias

Composer, PEAR

NPM

Enterprise Ready

Gran ecosistema de bibliotecas

Sí pero a veces difícil de encontrar

Frameworks comunes

CodeIgniter, CakePHP, Laravel, etc

Express, Meteor, etc

Soporte de bases de datos

NoIO de bloqueo

No

Pruebas frameworks

Aplicaciones en tiempo realaplicaciones en tiempo real

Sí con procesos adicionales como Apache WebSocket, etc.

Servidor web incorporado

No, la mayoría de la gente utiliza junto con Apache

  • Listo para desarrollar APIs en Node.js y conseguir que se conecten a tus datos? Echa un vistazo al framework Node.js LoopBack. Hemos hecho que sea fácil empezar ya sea localmente o en su nube favorita, con una simple instalación npm.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.