Con el auge de Twitter, los mensajes de texto SMS y otras formas de interacción con mensajes cortos, ha habido un auge de los servicios de acortamiento de URL. Por ejemplo, puedes utilizar TinyURL, Bitly, Owly y muchos otros. El propósito aquí es tomar URLs muy largas y hacerlas significativamente más cortas para distribuirlas en un mensaje.

Pero, ¿cómo funcionan estos servicios de acortamiento de URL?

Vamos a ver cómo crear nuestro propio acortador de URL usando Node.js con Express Framework y Couchbase Server con N1QL. En nuestro ejemplo, las URLs cortas serán generadas usando Node.js y serán almacenadas y accedidas usando Couchbase.

Requisitos

No hay demasiados requisitos para hacer posible este proyecto. Como mínimo necesitarás lo siguiente para tener éxito:

  • Servidor Couchbase 4.1+
  • Node.js 4.0+

Necesitamos usar una versión de Couchbase Server que soporte consultas N1QL. La versión Node.js es menos estricta, pero la necesitaremos para servir nuestra aplicación y obtener dependencias usando el Node Package Manager (NPM).

Preparación de Couchbase y comprensión del formato de datos

Antes de que podamos empezar a desarrollar nuestra aplicación Node.js necesitamos entender el plan de datos así como configurar Couchbase Server para permitir consultas N1QL.

En Couchbase, el objetivo es almacenar nuestros datos en el siguiente formato:

Pasaremos a la aplicación una URL larga y generaremos un hash corto único basado en un dato. Este hash se utilizará al construir la URL corta que también se almacenará en el documento de Couchbase. El id del propio documento será también el del valor hash.

Ahora necesitamos crear un bucket de Couchbase Server para almacenar los datos de nuestra aplicación. Este bucket puede crearse a través del Panel de Administración de Couchbase Server. Llamemos a este bucket ejemplo.

Al consultar datos, no siempre haremos búsquedas basadas en el valor de id. Esto significa que necesitaremos crear índices en los valores del documento para permitir consultas N1QL. Para mantener las cosas simples, crear un índice primario simple como el siguiente:

Esta consulta puede ser ejecutada usando el Couchbase Server Query Workbench (Enterprise Edition) o el Couchbase Shell conocido como CBQ. El índice no será el más rápido porque es muy general, pero cumplirá con las necesidades de nuestra sencilla aplicación.

Desarrollo de la aplicación Node.js URL Shortener con Express Framework

Con la base de datos correctamente configurada podemos preocuparnos del código detrás de la aplicación. Esta aplicación dependerá en gran medida de Express Framework y Couchbase, pero también de una librería de hashing conocida como Hashids.

Creación del proyecto con las dependencias

Vamos a crear un nuevo proyecto Node.js desde el símbolo del sistema (Windows) o Terminal (Mac y Linux):

El comando anterior creará un paquete.json donde quiera que estés navegando a través de la línea de comandos. Así que es de esperar que usted está dentro de un directorio fresco.

Ahora necesitamos instalar las dependencias del proyecto. Ejecute lo siguiente desde la línea de comandos:

En este punto podemos preocuparnos del desarrollo de JavaScript.

Arranque de la aplicación Node.js

Para mantener este proyecto simple y fácil de entender, vamos a mantener toda la lógica de la aplicación en un solo archivo. En una aplicación de producción es probable que desee romper por la limpieza y facilidad de mantenimiento, pero para este ejemplo vamos a estar bien.

Cree un archivo llamado app.js en la raíz del directorio de tu proyecto. En este archivo, lo primero que vamos a hacer es importar las dependencias instaladas así:

Porque todavía tengo que explicar el body-parser lo explicaré ahora. Esta dependencia nos permite realizar peticiones que contengan un cuerpo. Por ejemplo, al hacer peticiones POST o PUT es habitual incluir un cuerpo JSON en lugar de parámetros URL o parámetros de consulta.

Con las dependencias importadas necesitamos inicializar Express Framework y el motor N1QL de Couchbase:

Aunque hemos importado el body-parser todavía tenemos que inicializarlo. Queremos ser capaces de aceptar valores codificados JSON y URL, así que tenemos que configurar la dependencia así:

En este punto todas nuestras dependencias están inicializadas. Ahora sería una buena idea establecer una conexión con nuestro cluster de Couchbase Server y el bucket de la aplicación. Esto se puede lograr con la siguiente línea:

Finalmente comencemos a servir nuestra aplicación Node.js con lo siguiente:

Probablemente te estés dando cuenta de que en realidad no hemos añadido ninguna lógica. Estás en lo cierto, ya que hasta ahora sólo hemos hecho bootstrapping en nuestra aplicación.

Creación de la lógica de aplicación del acortador de URL

Lo que queremos hacer ahora es crear algunos RESTful API endpoints. Vamos a crear los siguientes puntos finales:

En raíz se utilizará para navegar a una URL larga enmascarada tras una URL corta. La dirección /ampliar tomará una URL corta y revelará la URL larga sin navegar hasta ella, y el endpoint /crear tomará una URL larga y creará una URL corta en la base de datos.

Empezando por el /crear y probablemente el punto final más complicado, tenemos lo siguiente:

Este endpoint es una petición POST que espera un cuerpo JSON. Si el campo longUrl JSON no existe, se devolverá un error al usuario.

Antes de crear la URL corta, queremos asegurarnos de que aún no se ha creado ninguna. Hacemos esto porque queremos una URL corta por cada URL larga. Podemos conseguirlo creando una consulta N1QL parametrizada basada en la directiva longUrl propiedad. Si la respuesta contiene un documento, lo devolveremos porque el documento ya existe. Si la respuesta no tiene un documento, necesitamos crear uno.

Utilización de la hashids podemos crear un hash basado en la marca de tiempo y usarlo como nuestro id y nuestra URL corta. Después de insertar este nuevo documento podemos devolverlo al usuario.

Veamos ahora cómo ampliar esas URL cortas.

El código anterior utiliza un concepto similar al de /crear punto final. Tomamos un shortUrl y consultarlo utilizando N1QL. Si se encuentra, podemos devolver la URL larga con la respuesta.

Por fin podemos preocuparnos de la navegación.

Recuerde que nuestras URL cortas tienen el formato http://localhost:3000/5Qp8oLmWX que es la misma ubicación que nuestro servicio API. Esto significa que 5Qp8oLmWX es sólo un parámetro URL para nuestro raíz punto final.

Con el id podemos hacer una búsqueda de documentos basada en el valor de la clave. Si tiene éxito tendremos el documento que se almacena actualmente.

El código fuente completo de la aplicación

En caso de que quieras ver el código fuente completo de la aplicación que acabamos de crear, puedes encontrarlo a continuación.

Probablemente hay muchas optimizaciones que se pueden hacer, pero nos preocupamos más por la lógica a la hora de hacer de este un proyecto exitoso.

Conclusión

Acabas de ver cómo crear un acortador de URL muy básico usando Node.js para la lógica de la aplicación, Couchbase Server como base de datos NoSQL y N1QL como tecnología de consulta.

Si quisieras llevar esto al siguiente nivel, podrías hacer un seguimiento de la información analítica. Por ejemplo, si alguien navega a la raíz endpoint, aumentar un contador, o almacenar el agente del navegador. Cosas simples para añadir un cool-factor a la aplicación acortador de URL.

Autor

Publicado por Nic Raboy, Defensor del Desarrollador, Couchbase

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.

Dejar una respuesta