Buenas prácticas y tutoriales

Pila completa con Node.js, Vue.js y Couchbase NoSQL

Si has estado al día, soy un gran defensor del desarrollo Node.js y la pila de desarrollo JavaScript. Anteriormente había escrito sobre el Pila Couchbase, Express, AngularJS y Node.js (CEAN) y modernización de la API backend con Hapi.jsuna alternativa popular a Express. Soy un gran fan de Angular, pero recientemente he estado explorando el cada vez más popular framework Vue.js.

Vamos a ver cómo crear una aplicación de pila completa utilizando la pila de JavaScript que consiste en Node.js, Hapi, Vue.js, y Couchbase NoSQL. Dado que todos los caracteres iniciales de las tecnologías son consonantes, no intentaré darle un acrónimo.

La aplicación que construyamos tendrá un modelo de datos semisimplista. Vamos a almacenar información sobre personas y direcciones y a configurar cómo se relacionan las direcciones con determinadas personas.

Hapi.js and Vue.js with Couchbase Project

El backend Node.js con Hapi va a demostrar el uso de N1QL y las mutaciones de subdocumentos dentro de la base de datos. El Vue.js frontend nos dará una salida semi-atractiva hacia el trabajo con nuestra API.

Configuración de Couchbase para consultas y control de acceso basado en roles

Antes de que podamos empezar a desarrollar nuestra API RESTful que se comunica con nuestra base de datos NoSQL Couchbase, la base de datos debe estar configurada correctamente. Vamos a suponer que ya has instalado Servidor Couchbase 5 o superior.

Con Couchbase listo para funcionar, necesitamos crear un Bucket para guardar nuestros datos. Este tutorial hará referencia a un Bucket llamado ejemplopero en realidad no importa mientras seas coherente.

Couchbase Example Bucket

El Cubo no necesita ninguna configuración especial para este ejemplo.

Con el Bucket disponible, necesitamos crear un usuario con permiso para trabajar con el Bucket. Para obtener información sobre la creación de control de acceso basado en roles (RBAC), echa un vistazo a un artículo anterior que escribí titulado, Proteja sus datos NoSQL con el control de acceso basado en roles de Couchbase. La cuenta necesitará Lector de datos, Redactor de datosy Seleccionar consulta roles. Esto nos permitirá realizar operaciones CRUD contra la base de datos, así como ejecutar consultas N1QL.

Por último, debemos preparar un índice para que admita consultas N1QL.

Couchbase N1QL Primary Index

En un entorno de producción querrás crear un índice para cada consulta que desees ejecutar. Para nuestro ejemplo, vamos a utilizar un índice primario que es un índice de prototipado.

Ejecute la siguiente consulta para crear el índice:

El índice primario nos dará la comodidad de poder ejecutar cualquier consulta sobre nuestro Bucket a costa del rendimiento. Los índices personalizados darán un rendimiento mucho mejor.

En este momento podemos empezar el desarrollo.

Desarrollo de un backend web con Node.js y Hapi Framework

Con Couchbase listo, podemos empezar a desarrollar la aplicación Node.js con Hapi. Si has visto mi artículo anteriormucho del material se mantendrá. Sin embargo, este ejemplo va a ser un poco más exhaustivo en lo que respecta a lo que Node.js y Couchbase pueden hacer.

Asumiendo que tienes Node.js instalado, necesitamos crear un proyecto fresco. Desde la CLI, ejecuta lo siguiente:

Los comandos anteriores inicializarán un nuevo proyecto e instalarán la aplicación hapi para Hapi.js, el paquete joi para la validación de datos, el paquete couchbase para interactuar con Couchbase, y el paquete uuid para generar cadenas únicas.

A continuación, cree un app.js que contendrá todo nuestro código Node.js. Para empezar, añade lo siguiente al archivo app.js file:

El código anterior importará nuestras dependencias, se conectará a nuestra instancia de Couchbase utilizando la información que habíamos especificado en el paso anterior y configurará nuestro servidor Hapi para que funcione en https://localhost:3000.

Cuando definimos nuestra información de conexión, elegimos habilitar el uso compartido de recursos entre orígenes (CORS). Esto permitirá que nuestra aplicación Vue.js se comunique con la aplicación Node.js aunque estén operando desde puertos diferentes. Más información sobre CORS con Hapi se puede encontrar en un artículo anterior que escribí.

En este punto podemos empezar a definir las rutas de los endpoints a nuestra API.

El objetivo es crear datos para personas y direcciones dentro de Couchbase. Dado que actualmente no existen datos para estas dos categorías, tiene sentido empezar con endpoints que realicen la creación de datos.

El código anterior creará un endpoint que acepta peticiones POST. Suponiendo que la carga útil JSON enviada con la solicitud cumple los criterios de la lógica de validación, la acción manipulador se utilizará. Se generará un identificador único y la carga útil se guardará con el identificador creado. En caso de éxito, la carga útil con el id se devolverá al cliente.

Se puede utilizar una lógica similar al crear direcciones:

La lógica de validación para las direcciones es un poco diferente, pero todo lo demás sigue siendo igual. Esta misma lógica puede aplicarse a prácticamente cualquier punto final de creación con solicitudes POST.

Con los documentos disponibles en Couchbase, podemos intentar consultarlos. Tiene sentido crear una consulta especializada que encuentre persona documentos o dirección documentos. Para ello utilizaremos N1QL.

La ruta anterior utilizará una consulta N1QL que obtendrá todos los documentos y sus claves de documento siempre que contengan una propiedad llamada tipo que es igual a dirección.

Del mismo modo, podríamos hacer lo mismo para persona documentos:

Sin embargo, esto es aburrido sólo consulta de documentos basados en su tipo propiedad. Probablemente deberíamos establecer una relación entre ambos tipos.

La idea aquí es que creamos un array dentro del archivo persona que contiene un identificador para cada dirección a la que están asociados. En lugar de obtener un documento completo, crear o actualizar la matriz, y luego guardar de nuevo, vamos a hacer una mutación subdocumento directamente en la base de datos.

Tomemos como ejemplo el siguiente punto final:

El punto final anterior espera que exista un parámetro de ruta y una carga útil en cada solicitud. El parámetro de ruta es el id de un persona y la carga útil contendrá un id de un dirección documento.

Utilizando el mutateIn podemos proporcionar un documento a mutar, y una ruta a la propiedad que debe ser mutada. En este caso, la propiedad persona será mutado, y añadiremos valores a un documento direcciones en su interior. Si el direcciones no existe, no te preocupes, se creará.

Una vez que se produce la mutación, vamos a bajar todo el documento que hemos mutado y se lo devolveremos al cliente.

Ahora podemos hacer una consulta N1QL más emocionante en nuestros datos. Echa un vistazo a este punto final revisado para recopilar persona documentos:

Ahora estamos haciendo una subconsulta. No estamos haciendo una simple consulta porque una matriz de valores de identificación de direcciones no es muy útil para nosotros. En su lugar, la subconsulta carga esos valores de identificación para que nuestros resultados tengan direcciones reales.

Guay, ¿verdad?

Terminemos nuestra API RESTful con un último endpoint.

El endpoint anterior nos permitirá devolver una única dirección concreta en función de su clave de documento.

Con la API creada, podrías probarla fácilmente con Postman o una herramienta similar. Sin embargo, vamos a crear un frontend para ella con Vue.js.

Creación de una interfaz de cliente con Vue.js

La idea detrás del frontend es que haremos peticiones HTTP al backend que acabamos de crear. La mayor parte de nuestro trabajo será en las solicitudes, la vinculación de datos, y el atractivo general de nuestra interfaz de usuario.

Si eres nuevo en Vue.js, asegúrate de obtener el Vue CLI. En un directorio nuevo, ejecuta lo siguiente con la CLI de Vue:

El comando anterior iniciará el proceso de andamiaje para Vue.js. Elija no para todo lo que se pide, ya que no vamos a utilizar todas esas características. Cuando se trata de un proyecto independiente (compilador y tiempo de ejecución) frente a sólo tiempo de ejecución, no importa para este ejemplo.

Cuando el andamiaje esté terminado, ejecuta los siguientes comandos:

Los comandos anteriores descargarán todas las dependencias necesarias para el proyecto base. Sin embargo, necesitamos una dependencia para hacer peticiones HTTP con Vue.js. Ejecuta lo siguiente desde la CLI:

En este proyecto se utilizará el axios paquete. Para obtener más información axios y hacer peticiones HTTP con Vue.js, echa un vistazo a un tutorial anterior que escribí titulado, Consumir datos de API remotas a través de HTTP en una aplicación web Vue.js.

Dentro de su proyecto debe tener un src/App.vue archivo. Para simplificar, esta será una aplicación de una sola página y un solo archivo. Ignora cualquier otro componente que haya sido creado con el andamio.

Antes de empezar a añadir marcas HTML y lógica JavaScript, incluyamos Bootstrap como marco temático. Abra el proyecto index.html y que tenga el siguiente aspecto:

La mayor parte de lo anterior se ha extraído del Documentación de iniciación a Bootstrap. Ahora, cuando empecemos a codificar en el src/App.vue se verá un poco más atractivo.

Como en la mayoría de los archivos de proyecto de Vue, hay un archivo <template>, <script>y <style> bloque. Nuestro <style> no tendrá nada especial, así que abre el bloque src/App.vue e incluya lo siguiente:

La mayor parte de nuestro trabajo estará en los otros dos bloques de código. Para simplificar, vamos a empezar con la lógica y luego terminar con la interfaz de usuario.

Dentro del proyecto src/App.vue incluya el siguiente código JavaScript:

En lo anterior ocurren muchas cosas, así que vamos a desglosarlas.

La primera parte de la lógica que añadimos se refiere a la inicialización de los datos. La página datos nos permitirá inicializar las variables utilizadas en este archivo en particular.

En el datos el método entrada se vinculará a un formulario en la interfaz de usuario. En nuestro caso tendremos dos formularios, uno para persona y uno para dirección. Por defecto, queremos que los valores estén en blanco. También estamos inicializando nuestra lista de gente y nuestra lista de direcciones que se obtendrá de la API de Node.js.

Después de inicializar las variables, necesitamos cargar algunos datos del servidor. Esto se puede hacer en el montado método.

Cuando se carga la aplicación, se realiza una solicitud de personas y otra de direcciones.

Esto nos lleva a la lista de métodos que se pueden llamar desde el HTML. La página crearPersona tomará los datos del formulario de persona y los enviará a la API para guardarlos. Del mismo modo, el método crearDirección hará lo mismo, pero con la información de la dirección.

En linkAddress es un poco diferente:

En linkAddress tomará un identificador de persona y un identificador de dirección y los enviará a nuestro punto final de la API de subdocumentos. Una vez hecho esto, actualizará la información en las variables locales para mostrarla en la interfaz de usuario.

Esto nos lleva a la parte HTML de nuestro archivo de aplicación. Dentro del archivo <template> deberíamos tener algo como lo siguiente:

La mayor parte del HTML anterior es Bootstrap boilerplate. Si alguna vez has trabajado con Bootstrap, sabrás que hay un montón de preparación involucrada.

Salta a la siguiente sección:

Tenga en cuenta que el entrada que habíamos inicializado está ahora vinculado a los elementos del formulario. Se trata de un enlace de datos bidireccional.

Cuando se pulsa el botón de formulario para este formulario en particular, el botón crearPersona es llamado. El otro elemento del formulario se comporta igual.

En la parte principal de la interfaz de usuario, tenemos una lista de datos recuperados del servidor:

Estamos listando personas, la información de dirección expandida de nuestra consulta N1QL del lado del servidor, y la interacción del botón de radio para emitir la solicitud de subdocumento.

Todo esto se hace fácilmente con Vue.js debido a la forma en que la interfaz de usuario está vinculada a la capa lógica.

Conclusión

Acabas de ver cómo crear una aplicación full stack compuesta estrictamente de tecnologías JavaScript. Usamos Node.js con el framework Hapi.js para la capa API backend y el framework Vue.js para nuestra capa frontend de navegador web. El frontend consume datos del backend y el backend obtiene sus datos de nuestro Couchbase Base de datos NoSQL.

Debido a que hicimos la aplicación muy modular, cada uno de los componentes puede ser intercambiado con una tecnología diferente. Podríamos cambiar Node.js para ser Java u otra cosa y podríamos cambiar Vue.js para ser otra cosa como Angular. Quieres ver cómo ir pila completa con Golang y Angular, echa un vistazo a este tutorial que escribí titulado, Crear una base de datos de películas con Golang, Angular y NoSQL.

Para obtener más información sobre el uso de Couchbase con Node.js, consulte la página Portal para desarrolladores de Couchbase.

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Nic Raboy

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.