{"id":2447,"date":"2016-12-05T16:24:35","date_gmt":"2016-12-05T16:24:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2447"},"modified":"2022-12-15T19:41:42","modified_gmt":"2022-12-16T03:41:42","slug":"create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/","title":{"rendered":"Crear un acortador de URL con Node.js y Couchbase usando N1QL"},"content":{"rendered":"<p>Con el auge de Twitter, los mensajes de texto SMS y otras formas de interacci\u00f3n 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\u00f3sito aqu\u00ed es tomar URLs muy largas y hacerlas significativamente m\u00e1s cortas para distribuirlas en un mensaje.<\/p>\n<p>Pero, \u00bfc\u00f3mo funcionan estos servicios de acortamiento de URL?<\/p>\n<p>Vamos a ver c\u00f3mo crear nuestro propio acortador de URL <a href=\"https:\/\/www.couchbase.com\/blog\/es\/build-a-rest-api-with-node-js-express-and-couchbase\/\">usando Node.js<\/a> con Express Framework y Couchbase Server con N1QL. En nuestro ejemplo, las URLs cortas ser\u00e1n generadas usando Node.js y ser\u00e1n almacenadas y accedidas usando Couchbase.<\/p>\n<h2 id=\"the-requirements\">Requisitos<\/h2>\n<p>No hay demasiados requisitos para hacer posible este proyecto. Como m\u00ednimo necesitar\u00e1s lo siguiente para tener \u00e9xito:<\/p>\n<ul>\n<li>Servidor Couchbase 4.1+<\/li>\n<li>Node.js 4.0+<\/li>\n<\/ul>\n<p>Necesitamos usar una versi\u00f3n de Couchbase Server que soporte consultas N1QL. La versi\u00f3n Node.js es menos estricta, pero la necesitaremos para servir nuestra aplicaci\u00f3n y obtener dependencias usando el Node Package Manager (NPM).<\/p>\n<h2 id=\"preparing-couchbase-and-understanding-the-data-format\">Preparaci\u00f3n de Couchbase y comprensi\u00f3n del formato de datos<\/h2>\n<p>Antes de que podamos empezar a desarrollar nuestra aplicaci\u00f3n Node.js necesitamos entender el plan de datos as\u00ed como configurar Couchbase Server para permitir consultas N1QL.<\/p>\n<p>En Couchbase, el objetivo es almacenar nuestros datos en el siguiente formato:<\/p>\n<pre><code>{\r\n    \"id\": \"5Qp8oLmWX\",\r\n    \"longUrl\": \"https:\/\/www.thepolyglotdeveloper.com\/2016\/08\/using-couchbase-server-golang-web-application\/\",\r\n    \"shortUrl\": \"https:\/\/localhost:3000\/5Qp8oLmWX\"\r\n}<\/code><\/pre>\n<p>Pasaremos a la aplicaci\u00f3n una URL larga y generaremos un hash corto \u00fanico basado en un dato. Este hash se utilizar\u00e1 al construir la URL corta que tambi\u00e9n se almacenar\u00e1 en el documento de Couchbase. El id del propio documento ser\u00e1 tambi\u00e9n el del valor hash.<\/p>\n<p>Ahora necesitamos crear un bucket de Couchbase Server para almacenar los datos de nuestra aplicaci\u00f3n. Este bucket puede crearse a trav\u00e9s del Panel de Administraci\u00f3n de Couchbase Server. Llamemos a este bucket <strong>ejemplo<\/strong>.<\/p>\n<p>Al consultar datos, no siempre haremos b\u00fasquedas basadas en el valor de id. Esto significa que necesitaremos crear \u00edndices en los valores del documento para permitir consultas N1QL. Para mantener las cosas simples, crear un \u00edndice primario simple como el siguiente:<\/p>\n<pre><code>CREATE PRIMARY INDEX ON `example` USING GSI;<\/code><\/pre>\n<p>Esta consulta puede ser ejecutada usando el Couchbase Server Query Workbench (Enterprise Edition) o el Couchbase Shell conocido como CBQ. El \u00edndice no ser\u00e1 el m\u00e1s r\u00e1pido porque es muy general, pero cumplir\u00e1 con las necesidades de nuestra sencilla aplicaci\u00f3n.<\/p>\n<h2 id=\"developing-the-node.js-url-shortener-application-with-express-framework\">Desarrollo de la aplicaci\u00f3n Node.js URL Shortener con Express Framework<\/h2>\n<p>Con la base de datos correctamente configurada podemos preocuparnos del c\u00f3digo detr\u00e1s de la aplicaci\u00f3n. Esta aplicaci\u00f3n depender\u00e1 en gran medida de Express Framework y Couchbase, pero tambi\u00e9n de una librer\u00eda de hashing conocida como Hashids.<\/p>\n<h3 id=\"creating-the-project-with-the-dependencies\">Creaci\u00f3n del proyecto con las dependencias<\/h3>\n<p>Vamos a crear un nuevo proyecto Node.js desde el s\u00edmbolo del sistema (Windows) o Terminal (Mac y Linux):<\/p>\n<pre><code>npm init --y<\/code><\/pre>\n<p>El comando anterior crear\u00e1 un <strong>paquete.json<\/strong> donde quiera que est\u00e9s navegando a trav\u00e9s de la l\u00ednea de comandos. As\u00ed que es de esperar que usted est\u00e1 dentro de un directorio fresco.<\/p>\n<p>Ahora necesitamos instalar las dependencias del proyecto. Ejecute lo siguiente desde la l\u00ednea de comandos:<\/p>\n<pre><code>npm install couchbase body-parser express hashids --save<\/code><\/pre>\n<p>En este punto podemos preocuparnos del desarrollo de JavaScript.<\/p>\n<h3 id=\"bootstrapping-the-node.js-application\">Arranque de la aplicaci\u00f3n Node.js<\/h3>\n<p>Para mantener este proyecto simple y f\u00e1cil de entender, vamos a mantener toda la l\u00f3gica de la aplicaci\u00f3n en un solo archivo. En una aplicaci\u00f3n de producci\u00f3n es probable que desee romper por la limpieza y facilidad de mantenimiento, pero para este ejemplo vamos a estar bien.<\/p>\n<p>Cree un archivo llamado <strong>app.js<\/strong> en la ra\u00edz del directorio de tu proyecto. En este archivo, lo primero que vamos a hacer es importar las dependencias instaladas as\u00ed:<\/p>\n<pre><code>var Couchbase = require(\"couchbase\");\r\nvar Express = require(\"express\");\r\nvar BodyParser = require(\"body-parser\");\r\nvar Hashids = require(\"hashids\");<\/code><\/pre>\n<p>Porque todav\u00eda tengo que explicar el <code>body-parser<\/code> lo explicar\u00e9 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\u00e1metros URL o par\u00e1metros de consulta.<\/p>\n<p>Con las dependencias importadas necesitamos inicializar Express Framework y el motor N1QL de Couchbase:<\/p>\n<pre><code>var app = Express();\r\nvar N1qlQuery = Couchbase.N1qlQuery;<\/code><\/pre>\n<p>Aunque hemos importado el <code>body-parser<\/code> todav\u00eda tenemos que inicializarlo. Queremos ser capaces de aceptar valores codificados JSON y URL, as\u00ed que tenemos que configurar la dependencia as\u00ed:<\/p>\n<pre><code>app.use(BodyParser.json());\r\napp.use(BodyParser.urlencoded({ extended: true }));<\/code><\/pre>\n<p>En este punto todas nuestras dependencias est\u00e1n inicializadas. Ahora ser\u00eda una buena idea establecer una conexi\u00f3n con nuestro cluster de Couchbase Server y el bucket de la aplicaci\u00f3n. Esto se puede lograr con la siguiente l\u00ednea:<\/p>\n<pre><code>var bucket = (new Couchbase.Cluster(\"couchbase:\/\/localhost\")).openBucket(\"ejemplo\");<\/code><\/pre>\n<p>Finalmente comencemos a servir nuestra aplicaci\u00f3n Node.js con lo siguiente:<\/p>\n<pre><code>var server = app.listen(3000, function() {\r\n    console.log(\"Escuchando en el puerto %s...\", server.address().port);\r\n});<\/code><\/pre>\n<p>Probablemente te est\u00e9s dando cuenta de que en realidad no hemos a\u00f1adido ninguna l\u00f3gica. Est\u00e1s en lo cierto, ya que hasta ahora s\u00f3lo hemos hecho bootstrapping en nuestra aplicaci\u00f3n.<\/p>\n<h3 id=\"creating-the-url-shortener-application-logic\">Creaci\u00f3n de la l\u00f3gica de aplicaci\u00f3n del acortador de URL<\/h3>\n<p>Lo que queremos hacer ahora es crear algunos RESTful API endpoints. Vamos a crear los siguientes puntos finales:<\/p>\n<pre><code>\/\r\n\/ampliar\r\n\/crear<\/code><\/pre>\n<p>En <strong>ra\u00edz<\/strong> se utilizar\u00e1 para navegar a una URL larga enmascarada tras una URL corta. La direcci\u00f3n <strong>\/ampliar<\/strong> tomar\u00e1 una URL corta y revelar\u00e1 la URL larga sin navegar hasta ella, y el endpoint <strong>\/crear<\/strong> tomar\u00e1 una URL larga y crear\u00e1 una URL corta en la base de datos.<\/p>\n<p>Empezando por el <strong>\/crear<\/strong> y probablemente el punto final m\u00e1s complicado, tenemos lo siguiente:<\/p>\n<pre><code>app.post(\"\/create\", function(req, res) {\r\n    if(!req.body.longUrl) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"A long URL is required\"});\r\n    }\r\n    bucket.query(N1qlQuery.fromString(\"SELECT `\" + bucket._name + \"`.* FROM `\" + bucket._name + \"` WHERE longUrl = $1\"), [req.body.longUrl], function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        if(result.length == 0) {\r\n            var hashids = new Hashids();\r\n            var response = {\r\n                id: hashids.encode((new Date).getTime()),\r\n                longUrl: req.body.longUrl\r\n            }\r\n            response.shortUrl = \"https:\/\/localhost:3000\/\" + response.id;\r\n            bucket.insert(response.id, response, function(error, result) {\r\n                if(error) {\r\n                    return res.status(400).send(error);\r\n                }\r\n                res.send(response);\r\n            });\r\n        } else {\r\n            res.send(result[0]);\r\n        }\r\n    });\r\n});<\/code><\/pre>\n<p>Este endpoint es una petici\u00f3n POST que espera un cuerpo JSON. Si el campo <code>longUrl<\/code> JSON no existe, se devolver\u00e1 un error al usuario.<\/p>\n<p>Antes de crear la URL corta, queremos asegurarnos de que a\u00fan 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 <code>longUrl<\/code> propiedad. Si la respuesta contiene un documento, lo devolveremos porque el documento ya existe. Si la respuesta no tiene un documento, necesitamos crear uno.<\/p>\n<p>Utilizaci\u00f3n de la <code>hashids<\/code> podemos crear un hash basado en la marca de tiempo y usarlo como nuestro id y nuestra URL corta. Despu\u00e9s de insertar este nuevo documento podemos devolverlo al usuario.<\/p>\n<p>Veamos ahora c\u00f3mo ampliar esas URL cortas.<\/p>\n<pre><code>app.get(\"\/expand\", function(req, res) {\r\n    if(!req.query.shortUrl) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"Se requiere una URL corta\"});\r\n    }\r\n    bucket.query(N1qlQuery.fromString(\"SELECT `\" + bucket._name + \"`.* FROM `\" + bucket._name + \"` WHERE shortUrl = $1\"), [req.query.shortUrl], function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        res.send(result.length &gt; 0 ? result[0] : {});\r\n    });\r\n});<\/code><\/pre>\n<p>El c\u00f3digo anterior utiliza un concepto similar al de <strong>\/crear<\/strong> punto final. Tomamos un <code>shortUrl<\/code> y consultarlo utilizando N1QL. Si se encuentra, podemos devolver la URL larga con la respuesta.<\/p>\n<p>Por fin podemos preocuparnos de la navegaci\u00f3n.<\/p>\n<pre><code>app.get(\"\/:id\", function(req, res) {\r\n    if(!req.params.id) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"Se requiere un id\"});\r\n    }\r\n    bucket.get(req.params.id, function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        res.redirect(result.value.longUrl);\r\n    })\r\n});<\/code><\/pre>\n<p>Recuerde que nuestras URL cortas tienen el formato <strong>https:\/\/localhost:3000\/5Qp8oLmWX<\/strong> que es la misma ubicaci\u00f3n que nuestro servicio API. Esto significa que <strong>5Qp8oLmWX<\/strong> es s\u00f3lo un par\u00e1metro URL para nuestro <strong>ra\u00edz<\/strong> punto final.<\/p>\n<p>Con el id podemos hacer una b\u00fasqueda de documentos basada en el valor de la clave. Si tiene \u00e9xito tendremos el documento que se almacena actualmente.<\/p>\n<h3 id=\"the-full-application-source-code\">El c\u00f3digo fuente completo de la aplicaci\u00f3n<\/h3>\n<p>En caso de que quieras ver el c\u00f3digo fuente completo de la aplicaci\u00f3n que acabamos de crear, puedes encontrarlo a continuaci\u00f3n.<\/p>\n<pre><code>var Couchbase = require(\"couchbase\");\r\nvar Express = require(\"express\");\r\nvar BodyParser = require(\"body-parser\");\r\nvar Hashids = require(\"hashids\");\r\n\r\nvar app = Express();\r\nvar N1qlQuery = Couchbase.N1qlQuery;\r\n\r\napp.use(BodyParser.json());\r\napp.use(BodyParser.urlencoded({ extended: true }));\r\n\r\nvar bucket = (new Couchbase.Cluster(\"couchbase:\/\/localhost\")).openBucket(\"example\");\r\n\r\napp.get(\"\/expand\", function(req, res) {\r\n    if(!req.query.shortUrl) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"A short URL is required\"});\r\n    }\r\n    bucket.query(N1qlQuery.fromString(\"SELECT `\" + bucket._name + \"`.* FROM `\" + bucket._name + \"` WHERE shortUrl = $1\"), [req.query.shortUrl], function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        res.send(result.length &gt; 0 ? result[0] : {});\r\n    });\r\n});\r\n\r\napp.post(\"\/create\", function(req, res) {\r\n    if(!req.body.longUrl) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"A long URL is required\"});\r\n    }\r\n    bucket.query(N1qlQuery.fromString(\"SELECT `\" + bucket._name + \"`.* FROM `\" + bucket._name + \"` WHERE longUrl = $1\"), [req.body.longUrl], function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        if(result.length == 0) {\r\n            var hashids = new Hashids();\r\n            var response = {\r\n                id: hashids.encode((new Date).getTime()),\r\n                longUrl: req.body.longUrl\r\n            }\r\n            response.shortUrl = \"https:\/\/localhost:3000\/\" + response.id;\r\n            bucket.insert(response.id, response, function(error, result) {\r\n                if(error) {\r\n                    return res.status(400).send(error);\r\n                }\r\n                res.send(response);\r\n            });\r\n        } else {\r\n            res.send(result[0]);\r\n        }\r\n    });\r\n});\r\n\r\napp.get(\"\/:id\", function(req, res) {\r\n    if(!req.params.id) {\r\n        return res.status(400).send({\"status\": \"error\", \"message\": \"An id is required\"});\r\n    }\r\n    bucket.get(req.params.id, function(error, result) {\r\n        if(error) {\r\n            return res.status(400).send(error);\r\n        }\r\n        res.redirect(result.value.longUrl);\r\n    })\r\n});\r\n\r\nvar server = app.listen(3000, function() {\r\n    console.log(\"Listening on port %s...\", server.address().port);\r\n});<\/code><\/pre>\n<p>Probablemente hay muchas optimizaciones que se pueden hacer, pero nos preocupamos m\u00e1s por la l\u00f3gica a la hora de hacer de este un proyecto exitoso.<\/p>\n<h2 id=\"conclusion\">Conclusi\u00f3n<\/h2>\n<p>Acabas de ver c\u00f3mo crear un acortador de URL muy b\u00e1sico usando Node.js para la l\u00f3gica de la aplicaci\u00f3n, Couchbase Server como base de datos NoSQL y N1QL como tecnolog\u00eda de consulta.<\/p>\n<p>Si quisieras llevar esto al siguiente nivel, podr\u00edas hacer un seguimiento de la informaci\u00f3n anal\u00edtica. Por ejemplo, si alguien navega a la <strong>ra\u00edz<\/strong> endpoint, aumentar un contador, o almacenar el agente del navegador. Cosas simples para a\u00f1adir un cool-factor a la aplicaci\u00f3n acortador de URL.<\/p>","protected":false},"excerpt":{"rendered":"<p>Con el auge de Twitter, los mensajes de texto SMS y otras formas de interacci\u00f3n con mensajes cortos, ha habido un auge de los servicios de acortamiento de URL. Por ejemplo, puedes utilizar TinyURL, Bitly, Owly, y tantos otros. El prop\u00f3sito aqu\u00ed es [...]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1822,1812],"tags":[1768,1767],"ppma_author":[9032],"class_list":["post-2447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-node-js","category-n1ql-query","tag-short-hash","tag-url-shortener"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Creating URL Shortener with Node.js and Couchbase using N1QL<\/title>\n<meta name=\"description\" content=\"How to create a very basic URL shortener using Node.js for the application logic, Couchbase Server as the NoSQL database, and N1QL as the query technology.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a URL Shortener with Node.js and Couchbase using N1QL\" \/>\n<meta property=\"og:description\" content=\"How to create a very basic URL shortener using Node.js for the application logic, Couchbase Server as the NoSQL database, and N1QL as the query technology.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-05T16:24:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-16T03:41:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Create a URL Shortener with Node.js and Couchbase using N1QL\",\"datePublished\":\"2016-12-05T16:24:34+00:00\",\"dateModified\":\"2022-12-16T03:41:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\"},\"wordCount\":1252,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"short hash\",\"url shortener\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Node.js\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\",\"name\":\"Creating URL Shortener with Node.js and Couchbase using N1QL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-12-05T16:24:34+00:00\",\"dateModified\":\"2022-12-16T03:41:42+00:00\",\"description\":\"How to create a very basic URL shortener using Node.js for the application logic, Couchbase Server as the NoSQL database, and N1QL as the query technology.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a URL Shortener with Node.js and Couchbase using N1QL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Crear acortador de URL con Node.js y Couchbase usando N1QL","description":"C\u00f3mo crear un acortador de URL muy b\u00e1sico utilizando Node.js para la l\u00f3gica de la aplicaci\u00f3n, Couchbase Server como base de datos NoSQL y N1QL como tecnolog\u00eda de consulta.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/","og_locale":"es_MX","og_type":"article","og_title":"Create a URL Shortener with Node.js and Couchbase using N1QL","og_description":"How to create a very basic URL shortener using Node.js for the application logic, Couchbase Server as the NoSQL database, and N1QL as the query technology.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2016-12-05T16:24:34+00:00","article_modified_time":"2022-12-16T03:41:42+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Create a URL Shortener with Node.js and Couchbase using N1QL","datePublished":"2016-12-05T16:24:34+00:00","dateModified":"2022-12-16T03:41:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/"},"wordCount":1252,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["short hash","url shortener"],"articleSection":["Best Practices and Tutorials","Node.js","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/","name":"Crear acortador de URL con Node.js y Couchbase usando N1QL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-12-05T16:24:34+00:00","dateModified":"2022-12-16T03:41:42+00:00","description":"C\u00f3mo crear un acortador de URL muy b\u00e1sico utilizando Node.js para la l\u00f3gica de la aplicaci\u00f3n, Couchbase Server como base de datos NoSQL y N1QL como tecnolog\u00eda de consulta.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/create-a-url-shortener-with-nodejs-and-couchbase-using-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Create a URL Shortener with Node.js and Couchbase using N1QL"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2447"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2447\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2447"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}