Couchbase v5.5.0 red License Apache%202.0 green

Qué construiremos

Vamos a crear una aplicación web de una sola página que muestre puntos de interés (POI) alrededor de hoteles seleccionados de una lista de ciudades. Los POI se mostrarán en un mapa interactivo de Google. Aquí tienes una animación que muestra los resultados finales.

Animated Application Demo

Hay algunos giros adicionales para mostrar algunas técnicas más avanzadas.

  • Las ciudades se eligen buscando aeropuertos que tengan hoteles cercanos en la misma ciudad.
  • Recuperamos los POI mediante una llamada REST, pero los guardamos en nuestra base de datos.
  • El lado del cliente recibe datos mediante pushes utilizando eventos enviados por el servidor.

Aunque el código es corto, muestra varias técnicas con la vinculación reactiva de datos de Vue y las características de dependencia de propiedades. Combinado con algunas características potentes de Couchbase, tendremos una aplicación bonita y funcional sin mucho trabajo.

Lo que necesita

La aplicación está construida completamente en JavaScript. Para empezar, solo necesitas unas pocas cosas.

  1. Node.js instalado
  2. Servidor Couchbase 5.5.0 o posterior instalado

También tendrás que conseguir llaves para el API JavaScript de Google Maps y el API REST AQUÍ. Ambos pueden utilizarse gratuitamente (con limitaciones).

Los datos para la aplicación vienen como muestra incorporada en la distribución de Couchbase Server.

Primeros pasos

Construiremos la estructura de la aplicación comenzando con el código del cliente web. A continuación viene el lado del servidor Node + código Express. Finalmente veremos el lado del servidor Couchbase.

Examinaremos con más detalle las consultas N1Ql, incluyendo ANSI se une. Esta aplicación utiliza el nuevo Servicio de eventos y funciones. Terminaremos viendo el código JavaScript.

Para empezar, crea un nuevo directorio donde quieras guardar el proyecto. Abra un símbolo del sistema y cambie a ese directorio.

El esqueleto del cliente web

Generación del andamiaje de cliente Vue.js

El cliente web utiliza Vue.js.

Usaremos el CLI de Vue para crear el proyecto base por nosotros. Voy a mostrar una fácil integración entre el cliente y el lado del servidor con webpack. Esto significará reordenar un poco los archivos.

Instala Vue CLI usando npm si aún no lo tienes.


Me gusta usar Bootstrap. Hay al menos un par de proyectos por ahí que integran Boostrap con Vue. Yo elegí Bootstrap-Vue. Esto no es realmente necesario. No es muy difícil eliminar esta dependencia si lo desea.

Crear el boilerplate del proyecto. Aquí es donde entra la plantilla webpack simple. El init le hará algunas preguntas. Utilizar los valores por defecto está bien.

Reestructuración y arreglo

Ahora, cambia al directorio del cliente. Mueve el directorio paquete.json y .gitignore creados en un nivel superior. Así se compartirán en todo el proyecto.


La configuración de webpack también tiene un pequeño error. Abrir webpack.config.js. En la sección que empieza por


cambie la línea de opciones para que diga

Instalar dependencias y compilar

Inicializar e instalar las dependencias de base.


Instale nuestras otras dependencias. Muchas de ellas son paquetes estándar (morgan, body-parser). Yo uso axios para llamadas de red. canal sse es un buen paquete de eventos enviados por servidor. Es un poco más sofisticado y fácil de usar que otros que he probado. Y hay un paquete para facilitar el trabajo con Google Maps en Vue llamado vue2-google-maps.

Instale el resto de las dependencias de la siguiente manera. Esto incluye lo que necesitaremos para el servidor.


Esto le dará un front-end basado en Vue. Para construirlo, ya que hemos movido paquete.json subir un nivel, necesitamos retocar la sección de scripts npm. Editar paquete.json en la raíz del proyecto y cambie la línea de compilación a


Ahora en el cliente haz npm run build.

Puede abrir el index.html pero no funcionará. Saltaremos adelante para crear el servidor, o puedes intentar arreglar el problema aquí si sólo quieres ver el cliente autónomo.

El esqueleto del servidor web

Vuelva a la raíz del proyecto y prepare el directorio del servidor.

Vamos a crear el servidor directamente. Inicie la aplicación base editando un nuevo archivo app.js. Pega lo siguiente y guárdalo.

Esta es una versión simplificada de la final. Sólo sirve el cliente boilerplate que creamos antes.

En este punto, deberías poder ejecutar node app.js en el directorio del servidor. Abra una pestaña del navegador y vaya a http://localhost:8080. Deberías ver algo como esto.

Vue Client Template

El cliente y el servidor

El código del cliente web

Ahora volveremos y crearemos el cliente real. En el directorio del cliente, bajo el subdirectorio srcAbrir el expediente App.vue. Actualízalo como sigue.

Este es el grueso del código del lado del cliente.

No voy a entrar en detalles sobre la sección de la plantilla o el css. Señalaré un buen elemento. La API de Here devuelve, entre otras cosas, enlaces a iconos adecuados para su uso en Mapas. Si sigues el flujo, verás que los marcadores de mapas cargan esos iconos directamente usando las URLs incluidas.

Conexión de la base de datos Vue

Recorriendo la sección de scripts, verás que hago un uso intensivo de las capacidades reactivas de Vue. Para entender esta parte, te ayudará tener al menos cierta familiaridad con Vue, especialmente con propiedades calculadas y observadores, datos, método y ganchos del ciclo de vida.

Hacemos uso de la montado para añadir un receptor de eventos enviados por el servidor, y para rellenar inicialmente la lista desplegable de ciudades. La parte más pesada de la lógica de negocio tiene lugar en la consulta a la base de datos, como veremos.

Veamos cómo funciona la selección de una ciudad. Observa que cada elemento del botón desplegable tiene un receptor de clics que establece seleccionado a los datos de la ciudad para esa entrada. Tenemos un método de vigilancia definido en seleccionado. Vue también sabe automáticamente que la propiedad calculada mostrar depende de seleccionado.

Esto significa que cada vez que se selecciona una ciudad a través del menú desplegable, se produce una cascada de actividad. Cambiar seleccionado causa mostrar se vuelva a calcular. Esto, a su vez, establece el texto del botón desplegable, ya que está vinculado a mostrar. En seleccionadoen el método ver actualiza la tabla de hoteles cada vez que se selecciona una nueva ciudad.

La mesa artículos están vinculados a destinationsProvider en métodos. Al actualizar la tabla se ejecuta el código. Al igual que la lista de ciudades original, obtiene los hoteles mediante una llamada asíncrona a nuestra base de datos a través de un punto final REST del servidor.

Vue se encarga de mucho aquí por nosotros. Por ejemplo, la llamada para refrescar la tabla no recibe los datos inmediatamente. Vue volverá a renderizar las partes relevantes del DOM automáticamente cada vez que vuelva la llamada REST. No tenemos que suministrar nada del cableado, aparte de especificar el enlace entre artículos y destinationProvider.

Completar el Cliente Web

Para terminar el lado del cliente, tenemos un par de otros pasos cortos que hacer.Tenemos que importar el módulo para ayudar con Google Maps, y el suministro de una clave. Editar main.js. Añade una línea de importación y dile a Vue que use el nuevo componente. Aquí está el código final.

Cargamos la clave API de Google Maps desde un archivo config.js. Crea ese archivo y por ahora añade este código de marcador de posición.

Vuelva a crear el proyecto (npm run build). Inicie el servidor, recargue el sitio, y debería ver el comienzo de nuestro cliente real con este aspecto.

Initial Version of Tutorial Client

El código del servidor web

A continuación completaremos la parte del servidor. Nuestro servidor alimenta las páginas web y expone la API REST que necesitamos. La API es en su mayoría sólo la conveniencia de embalaje en torno a la funcionalidad de base de datos.

En el código fuente del servidor, sustituya nuestro app.js con esto.

Las diferencias clave son la configuración del cliente Couchbase Server Node, y el cableado de las rutas para los puntos finales REST. Hay otro código adicional para cosas como servir sobre http y https, también. No veremos esas partes.

Conexión a Couchbase Server

Los dos bloques de código para conectar con nuestra base de datos son muy sencillos.

Las tres primeras líneas importan el cliente Couchbase Node, crean un nuevo objeto cluster que representa un cluster de nodos de base de datos, y autentifican a ese cluster. Esto inicia la conexión a la base de datos.

Para mayor comodidad, añadimos referencias a los objetos cliente y cluster a app.locales. Esto hace que estén disponibles en todo el mundo.

Por último, el código establece y guarda conexiones con dos cubos. Cubos son una estructura organizativa de alto nivel en Couchbase.

El primer bucket lo rellenaremos con datos de ejemplo que vienen con las instalaciones de Couchbase Server. Para el segundo cubo, estoy amañando un poco las cosas aquí. Necesitamos un bucket de metadatos para el archivo Servicio de concursos. Como veremos, sólo necesitamos almacenar un par de documentos adicionales que deben ir a algún sitio aparte del cubo principal. En lugar de crear un tercer bucket, simplemente los pongo con los datos de eventos. Normalmente no usarías este atajo en producción.

Archivos estáticos y rutas API

Tenemos sólo unas pocas líneas de código que necesitamos para dirigir Express para servir nuestras páginas estáticas construidas desde el código del cliente y para organizar nuestra API de datos del servidor.

La plantilla index.html La página de inicio de la aplicación añade dist a todas las rutas de los archivos. Esto significa que nuestros archivos estáticos en realidad se sirven desde un directorio raíz de /cliente/dist.

He separado la API de datos en dos grupos, organizados bajo un epígrafe general rutas subdirectorio. Los puntos finales empiezan por registros. Estos recuperarán datos de la base de datos.

En eventos es única. Los endpoints son utilizados tanto por el cliente web como por el servicio de eventos de Couchbase.

Veamos la registros código primero.

API de acceso a bases de datos

Aquí tenemos definidas tres rutas, /destinos, /hoteles/porCiudad/:idy /selección/geo. Todos tienen la misma estructura básica. Obtenemos nuestras referencias a la base de datos, utilizamos bluebird para crear una promesa versiones del método de consulta, construir un N1QL dispararla y devolver los resultados.

Repasemos las consultas, empezando por la más sencilla.

Consultas N1QL

Utilizamos La /selección/geo para almacenar la elección de hotel realizada por el usuario. Aquí está la consulta desglosada.

UPSERT modificará un documento, o lo creará si aún no existe. Almacenamos la geolocalización del hotel elegido en un documento con un id de desencadenar. Probablemente suene extraño. Tendrá más sentido más adelante, cuando lleguemos al código Eventing. Lo que realmente nos interesa no es sólo la ubicación del hotel, sino los puntos de interés cercanos. Este documento pondrá en marcha la secuencia que recupera esos POI. De ahí la razón de llamar al documento desencadenar.

He aquí un ejemplo del documento creado.

desencadenar

Para comprender la /hoteles/porCiudad/:id consulta, primero eche un vistazo a un par de documentos de ejemplo.

hotel_1359

aeropuerto_1361

Para nuestra tabla de hoteles, necesitamos el nombre del hotel, la dirección, la geolocalización, el nombre del aeropuerto y el código del aeropuerto. Obviamente, eso es combinar datos de ambos documentos. Para ello utilizamos un INNER JOIN. Esta es la consulta.

Caminando a través de él, se puede ver que somos capaces de realizar la unión utilizando los documentos de la misma cubeta. Utilizo alias para hacer las cosas más claras. Utilizamos la ciudad de cada documento para formar la condición de unión. Observa que también utilizo el documento tipotanto en la condición de unión como en la de DONDE cláusula. Las condiciones de unión pueden ser bastante sofisticadas. Lea esto blog para más detalles y ejemplos.

Por último, examinemos cómo hemos obtenido nuestra lista de ciudades. Esta es la consulta para el /destinospunto final.

El único resultado devuelto es una lista de nombres de ciudades. En este caso, estamos utilizando una unión interna como filtro. Al emparejar las ciudades con aeropuertos con las ciudades con hoteles, obtenemos una lista de las ciudades que tienen ambos.

Las uniones internas pueden utilizar dos enfoques algorítmicos diferentes. La primera unión que vimos utiliza la unión de bucle anidado por defecto.

Este último ejemplo utiliza una tabla hash en memoria. Esto puede acelerar considerablemente una unión, sobre todo cuando uno de los dos conjuntos de datos es pequeño. Hemos utilizado la tabla "USE HASH()" para informar a N1QL de cómo queremos optimizar la consulta. Hay un lado "probe" y un lado "build". La tabla hash se construye a partir de los datos del lado de construcción. La unión se realiza haciendo búsquedas en los datos del lado de la sonda.

La pista que dimos arriba le dice a N1QL que use los datos del hotel para el lado de la sonda en este caso. Es decir, se construirá la tabla a partir de los datos del aeropuerto, a continuación, hacer las búsquedas hash utilizando los datos del hotel.

Si no lo has hecho antes, te animo a que pruebes estas consultas directamente en el Couchbase Server Query Workbench, parte de la consola de administración web.

Eventos enviados por el servidor

Ya hemos mencionado la creación de un receptor de eventos para eventos enviados por el servidor en el lado del cliente. Estos dos puntos finales muestran lo que se necesita en el servidor.

La versión "get" del poi es llamado por el navegador cuando el EventSource se construye. Puedes ver que simplemente añadimos la persona que llama como cliente.

Utilizamos la versión "post" como intermediaria para enviar los datos al cliente. El sitio res.send(''); nos da una pista de cómo funciona. En el código Eventing, vamos a utilizar las capacidades N1QL cURL para empujar los datos a este punto final. La respuesta vacía está ahí para cerrar esa transacción.

A continuación, el servidor reenvía los datos a los clientes que estén a la escucha. Hay muchos más detalles. Si quieres saber más, este artículo tiene buena información.

Acabado del servidor

Para terminar el lado servidor de nuestro proyecto, crea un subdirectorio rutas en el directorio del servidor.

Copie el registros en un archivo llamado registros.js. Copia el eventos en un archivo llamado eventos.js. Y, por último, en el propio directorio del servidor, cree un nuevo archivo llamado .env. Pegue allí los siguientes parámetros de configuración y guárdelos. (Por supuesto, cambie los parámetros que necesite).

El servidor ya debería estar listo. En el directorio raíz del servidor, ejecute node app.js. No olvides construir primero el código cliente.

El código del servicio de eventos del servidor Couchbase

Aquí está la última parte de la salsa especial que hace que esta aplicación funcione. En la versión 5.5.0, Couchbase introdujo la función Servicio de concursos. Esta es probablemente mi nueva característica favorita en la serie de lanzamientos 5.5. Couchbase Functions es el primer componente ofrecido como parte de este servicio. En resumen, Functions te permite ejecutar código en el servidor de base de datos en respuesta a los cambios en la base de datos.

Las funciones están escritas en JavaScript estándar, con algunos adiciones y restricciones. Para crear la función que necesitamos, sigue estos pasos.

Cubo de metadatos de eventos

En primer lugar, cree un bucket para los metadatos de eventing.

  • Abra la consola de Couchbase Server e inicie sesión si es necesario
  • Haga clic en "Cubos" en el menú de la izquierda
  • Haga clic en "Añadir cubo" en la esquina superior derecha
  • Entre en concurso para el nombre del cubo en el cuadro de diálogo que aparece
  • Haga clic en "Añadir cubo" para terminar

Añadir una función

Ahora, configura la función y añade el código.

  • Haga clic en "Eventos" en el menú de la izquierda
  • Haga clic en "Añadir función" en la esquina superior derecha

Aparecerá un cuadro de diálogo.

  • Seleccione viaje-muestra como cubo de origen
  • Seleccione concurso como cubo de metadatos
  • Entre en monitor (o lo que desee) para el Nombre de la función
  • En "Fijaciones", seleccione tipo a "Alias", nombre a "muestra-viaje", y valor a "db"
  • Haga clic en "Siguiente: Añadir código".

Adding a Function

Esto le llevará al editor de código. Está pre-llenado con las firmas de función. Copie este código en su lugar.

https://gist.github.com/HodGreeley/9e25f9072247e180ec5cd764d9048c3b#file-poi-js

Despliegue de una función

Para desplegar este código, primero haga clic en "Guardar" y, a continuación, vuelva a hacer clic en "Eventos" en el menú de la izquierda. Deberías ver una entrada para la función. Haz clic en cualquier lugar de esa barra. Deberías verla expandida.

Deploying a Function

Haga clic en "Desplegar" y, a continuación, en "Desplegar función".

Comprender el código de función

OnUpdate se ejecuta cada vez que cambia un documento. Recibe el documento y los metadatos del documento como parámetros.

Buscamos el desencadenar documento a cambiar, indicando la selección de un nuevo hotel. La primera línea filtra todos los demás documentos basándose en el identificador del documento (a veces denominado clave del documento).

La siguiente línea muestra algunas cosas interesantes. Recupere db es un alias para el cubo de muestras de viajes. db['aquí'] recupera directamente un documento con id aquí. Aquí es donde almacenaremos las credenciales necesarias para el AQUÍ servicios de cartografía.

Preparamos la URL y los datos para nuestra solicitud de puntos de interés. Here tiene un montón de funcionalidades interesantes en su API. Sólo vamos a hacer una petición básica.

Con esa información en la mano, estamos listos para nuestra llamada cURL. Construyendo la consulta N1QL, vemos una de las modificaciones al JavaScript estándar: Puedes escribir tus consultas en línea de la misma manera que las construirías en el Query Workbench.

Vemos otro bonito detalle en la consulta cURL. N1QL proporciona una sintaxis conveniente para filtrar los resultados. Añadiendo la ruta .resultados.item hasta el final, cogemos sólo los datos que queremos.

A continuación ejecutamos la consulta y, utilizando esa misma db[] taquigrafía, actualice nuestro poi documento. Éste es un ejemplo de utilización de una función para aumentar los datos. En otro escenario, podríamos derivar nuestra actualización enteramente de los registros de la base de datos. Por ejemplo, podría rellenar todos los detalles de un carro de la compra a medida que un cliente hace selecciones.

Por último, con nuestros puntos de interés en la mano, volvemos a utilizar cURL para empujar los datos a nuestro punto final del servidor web. Recordemos que la versión "post" de poi API ingiere los datos entrantes y los devuelve a los clientes registrados. Así podemos hacer que la interfaz de usuario del cliente reaccione a los cambios de la base de datos sin tener que sondear.

Pasos finales

Ya estamos listos para montarlo todo. Puedes probar la aplicación tal cual, pero la parte de los mapas no funcionará todavía. Para ello, se necesita una clave de API de Google Maps, y un conjunto de credenciales de HERE.

La tecla Mapas va en el config.js en el código del cliente. Guarde las claves AQUÍ en un documento en el concurso cubo. Puede hacerlo directamente en la consola de administración haciendo clic en "Documentos" en el menú de la izquierda y luego en "Añadir documento" en la parte superior derecha. Utilice esto como plantilla.

aquí

Y, por último, como medida de seguridad, cURL está desactivado por defecto. En la consola de administración, haga lo siguiente.

  • Haga clic en "Configuración" en el menú de la izquierda
  • Haga clic para ampliar "Configuración avanzada de consultas"
  • Seleccione "Sin restricciones" en "Acceso a la función CURL()".

Esto es no lo que usted quiere para la producción. En su lugar, usted querría una lista blanca de un conjunto selecto de URLs. Sin embargo, esto servirá para nuestro proyecto.

Con eso, en el directorio del servidor web, ejecute node app.js. Abrir localhost:8080 en su navegador (o lo que haya elegido en .env) y pruébalo.

Fuente

Puedes encontrar el código fuente de toda la aplicación en GitHub aquí. He incluido un script configuración para simplificar la preparación de todo. Sólo tienes que ejecutar ./configuración e introduzca sus claves. (Puede que tengas que hacerlo ejecutable primero.) Todavía necesitas ejecutar npm instalary construir el código del cliente.

Webinar

Esta aplicación se utilizó como parte de una demostración en un webinar de Couchbase. Puedes ver una grabación del mismo aquí. No deje de consultar otros seminarios web en el área de recursos de Couchbase.

Posdata

Couchbase es de código abierto y probar gratis.
Empezar con código de ejemplo, consultas de ejemplo, tutoriales y mucho más.
Más recursos en nuestra portal para desarrolladores.
Síguenos en Twitter @CouchbaseDev.
Puede enviar preguntas a nuestro foros.
Participamos activamente en Stack Overflow.
Envíame tus preguntas, comentarios, temas que te gustaría ver, etc. a Twitter. @HodGreeley

Autor

Publicado por Hod Greeley, Defensor del Desarrollador, Couchbase

Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene más de dos décadas de experiencia como ingeniero de software y director de ingeniería. Ha trabajado en una variedad de campos de software, incluyendo física computacional y química, seguridad informática y de redes, finanzas y móviles. Antes de unirse a Couchbase en 2016, Hod dirigió las relaciones con desarrolladores para móviles en Samsung. Hod es doctor en física química por la Universidad de Columbia.

1 Comentarios

  1. ¡Buen post! Gracias.

    El primer enlace al repositorio de github está mal. Tiene un ":" al final.

Dejar una respuesta