{"id":2482,"date":"2017-01-07T15:00:00","date_gmt":"2017-01-07T15:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2482"},"modified":"2025-06-13T20:15:32","modified_gmt":"2025-06-14T03:15:32","slug":"create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/","title":{"rendered":"Crear una aplicaci\u00f3n de escritorio que se sincroniza con Electron, PouchDB, Ionic 2 y Couchbase"},"content":{"rendered":"<p>He estado en un papel cuando se trata de JavaScript y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\">Couchbase<\/a>. En las \u00faltimas semanas he estado creando contenido que gira en torno al framework Angular 2, la librer\u00eda JavaScript PouchDB, y Ionic Framework para m\u00f3viles. Lo que a\u00fan no he explorado es Couchbase en una aplicaci\u00f3n de escritorio construida con Angular 2.<\/p>\n<p>Hace dos a\u00f1os escrib\u00ed sobre el uso de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/build-a-desktop-app-with-github-electron-and-couchbase\/\">Couchbase en una aplicaci\u00f3n de escritorio usando AngularJS 1.0 y Electron<\/a>...pero con la tecnolog\u00eda bien podr\u00eda haber habido dinosaurios en esa \u00e9poca. Han cambiado muchas cosas y este post, que en su d\u00eda fue estupendo, merece una actualizaci\u00f3n.<\/p>\n<p>Vamos a ver c\u00f3mo crear una aplicaci\u00f3n de escritorio utilizando <a href=\"https:\/\/electron.atom.io\/\">Electr\u00f3n<\/a> que funciona con Angular 2, PouchDB, Ionic 2 y Couchbase.<\/p>\n<h2 id=\"the-requirements\">Requisitos<\/h2>\n<p>Hay numerosos requisitos que deben cumplirse para que este proyecto sea un \u00e9xito. Son los siguientes:<\/p>\n<ul>\n<li>Node.js 4.0+<\/li>\n<li><a href=\"https:\/\/www.ionicframework.com\">Marco i\u00f3nico<\/a> 2.0<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Pasarela de sincronizaci\u00f3n Couchbase<\/a><\/li>\n<\/ul>\n<p>El enfoque y punto de este tutorial no es Ionic 2. Sin embargo, Ionic 2 tiene una capa de interfaz de usuario muy fina que nos ahorrar\u00e1 tiempo sobre soluciones alternativas como Bootstrap o Foundation. Ionic 2 tambi\u00e9n tiene Angular 2 incorporado. Dicho esto, necesitaremos la CLI de Ionic 2 instalada. Node.js es un requisito debido al Node Package Manager (NPM) que utilizaremos para reunir las dependencias.<\/p>\n<p>No incluiremos Couchbase Server en este ejemplo, sino Couchbase Sync Gateway y su base de datos de prototipos en memoria. No es m\u00e1s que una sola l\u00ednea para cambiar a Couchbase Server desde este ejemplo. PouchDB se comunicar\u00e1 desde nuestra aplicaci\u00f3n de escritorio a Sync Gateway y en la otra direcci\u00f3n tambi\u00e9n.<\/p>\n<h2 id=\"configuring-couchbase-sync-gateway\">Configuraci\u00f3n de Couchbase Sync Gateway<\/h2>\n<p>Sync Gateway gestiona toda la orquestaci\u00f3n de datos y debe configurarse para cada aplicaci\u00f3n. Para esta aplicaci\u00f3n en concreto, vamos a permitir que todos los dispositivos conectados puedan leer y escribir datos.<\/p>\n<p>Una configuraci\u00f3n de este tipo tendr\u00eda el siguiente aspecto:<\/p>\n<pre><code>{\r\n    \"log\":[\"CRUD+\", \"REST+\", \"Changes+\", \"Attach+\"],\r\n    \"databases\": {\r\n        \"example\": {\r\n            \"server\":\"walrus:\",\r\n            \"sync\":`\r\n                function (doc) {\r\n                    channel (doc.channels);\r\n                }\r\n            `,\r\n            \"users\": {\r\n                \"GUEST\": {\r\n                    \"disabled\": false,\r\n                    \"admin_channels\": [\"*\"]\r\n                }\r\n            }\r\n        }\r\n    }\r\n}<\/code><\/pre>\n<p>En la configuraci\u00f3n de ejemplo anterior, utilizaremos una base de datos denominada <strong>ejemplo<\/strong>pero en realidad puede llamarse como quieras. La configuraci\u00f3n debe guardarse en un archivo, por ejemplo, <strong>sync-gateway-config.json<\/strong>.<\/p>\n<p>Con Couchbase Sync Gateway descargado e instalado, la configuraci\u00f3n se puede ejecutar de la siguiente manera:<\/p>\n<pre><code>\/ruta\/hacia\/sync_gateway \/ruta\/hacia\/sync-gateway-config.json<\/code><\/pre>\n<p>A continuaci\u00f3n, se puede acceder a Sync Gateway desde https:\/\/localhost:4985\/_admin\/.<\/p>\n<h2 id=\"creating-an-ionic-2-project-destined-for-the-pc\">Creaci\u00f3n de un proyecto Ionic 2 destinado al PC<\/h2>\n<p>Si has visto mi gu\u00eda anterior sobre el tema de la <a href=\"https:\/\/www.couchbase.com\/blog\/es\/syncing-with-couchbase-in-an-ionic-2-app-using-pouchdb\/\">Couchbase con Ionic 2 y PouchDB<\/a>probablemente se pregunte qu\u00e9 ser\u00e1 diferente aqu\u00ed. La verdad es que nada. Las aplicaciones Ionic 2 que no utilizan funciones nativas de Android e iOS se pueden integrar en aplicaciones Electron sin problemas. Sin embargo, se han realizado algunas optimizaciones en esta aplicaci\u00f3n frente a la anterior.<\/p>\n<div class=\"figure\"><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2017\/january\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/electron-ionic2-cbmobile.gif\" alt=\"Electron with Couchbase and Ionic 2\" \/><\/div>\n<p>En la animaci\u00f3n de arriba puedes ver una simple lista de tareas de una aplicaci\u00f3n Electron donde puedes a\u00f1adir elementos a la lista y sincronizarlos con Couchbase Sync Gateway y eventualmente con otros dispositivos y Couchbase Server.<\/p>\n<p>Empecemos creando ese sencillo ejemplo.<\/p>\n<h3 id=\"making-a-fresh-project-with-the-dependencies\">Creaci\u00f3n de un nuevo proyecto con las dependencias<\/h3>\n<p>Antes de que podamos empezar a desarrollar la aplicaci\u00f3n y empaquetarla en Electron, necesitamos crear un proyecto nuevo con cada una de las dependencias.<\/p>\n<p>Desde el S\u00edmbolo del sistema o Terminal, ejecute lo siguiente:<\/p>\n<pre><code>ionic start ElectronExample blank --v2\r\ncd ElectronExample<\/code><\/pre>\n<p>Con el proyecto Ionic 2 creado necesitamos reunir algunas dependencias como Electron y PouchDB. Para ello ejecuta lo siguiente:<\/p>\n<pre><code>npm install pouchdb --save\r\nnpm install uuid @types\/uuid --save\r\nnpm install electron --save-dev<\/code><\/pre>\n<p>Debido a que esta aplicaci\u00f3n Angular 2 utilizar\u00e1 TypeScript, es mejor utilizar bibliotecas JavaScript con definiciones de tipos. Sin embargo, PouchDB no tiene un conjunto oficial de definiciones de tipos, haci\u00e9ndolas obsoletas. Podemos evitarlo incluyendo la siguiente dependencia:<\/p>\n<pre><code>npm install @tipos\/node --save<\/code><\/pre>\n<p>La dependencia anterior nos dar\u00e1 acceso a la aplicaci\u00f3n <code>requiere<\/code> para poder importar bibliotecas JavaScript a nuestro proyecto.<\/p>\n<h3 id=\"adding-electron-for-desktop-support\">A\u00f1adir Electron para soporte de escritorio<\/h3>\n<p>Con el proyecto creado necesitamos a\u00f1adir soporte para Electron. Esto se hace a\u00f1adiendo un archivo de configuraci\u00f3n JavaScript especial que Electron procesa en el arranque.<\/p>\n<p>En la ra\u00edz de su proyecto, cree un archivo llamado <strong>electron.js<\/strong> con el siguiente c\u00f3digo JavaScript:<\/p>\n<pre><code>const electron = require('electron')\r\nconst app = electron.app\r\nconst BrowserWindow = electron.BrowserWindow\r\n\r\nconst ruta = require('ruta')\r\nconst url = require('url')\r\n\r\nlet mainVentana\r\n\r\nfunction createWindow () {\r\n    mainWindow = new BrowserWindow({ancho: 800, alto: 600})\r\n\r\n    mainWindow.loadURL(url.format({\r\n        pathname: path.join(__dirname, 'www\/index.html'),\r\n        protocolo: 'archivo:',\r\n        barras: true\r\n    }))\r\n\r\n    mainWindow.on('cerrado', function () {\r\n        mainWindow = null\r\n    })\r\n}\r\n\r\napp.on('ready', createWindow)\r\n\r\napp.on('ventana-toda-cerrada', function () {\r\n    if (process.platform !== 'darwin') {\r\n        app.quit()\r\n    }\r\n})\r\n\r\napp.on('activar', function () {\r\n    if (mainWindow === null) {\r\n        createWindow()\r\n    }\r\n})<\/code><\/pre>\n<p>La mayor parte del c\u00f3digo anterior se ha tomado directamente del archivo <a href=\"https:\/\/github.com\/electron\/electron-quick-start\">Plantilla Electron Starter<\/a>a excepci\u00f3n de esta l\u00ednea:<\/p>\n<pre><code>pathname: path.join(__dirname, 'www\/index.html'),<\/code><\/pre>\n<p>En la l\u00ednea anterior le estamos diciendo a Electron qu\u00e9 p\u00e1gina de Ionic 2 cargar cuando se inicie la aplicaci\u00f3n. Mientras se realiza el bootstrapping de Electron, necesitamos empaquetarlo en nuestros scripts de compilaci\u00f3n.<\/p>\n<p>Abra el archivo <strong>paquete.json<\/strong> e incluya esta l\u00ednea:<\/p>\n<pre><code>\"main\": \"electron.js\",<\/code><\/pre>\n<p>La l\u00ednea anterior le dice a Electron cu\u00e1l es el archivo de configuraci\u00f3n. Es necesario porque tal vez usted no nombr\u00f3 su archivo <strong>electron.js<\/strong> como hice yo. Tambi\u00e9n necesitamos a\u00f1adir un script particular que construya el proyecto y lo lance con Electron:<\/p>\n<pre><code>\"scripts\": {\r\n    \"ionic:build\": \"ionic-app-scripts build\",\r\n    \"ionic:serve\": \"ionic-app-scripts serve\",\r\n    \"electron\": \"ionic-app-scripts build; electron .\"\r\n},<\/code><\/pre>\n<p>No empaquetar\u00e1 la aplicaci\u00f3n para su despliegue en una tienda de aplicaciones, pero nos permitir\u00e1 probarla correctamente con Electron en nuestro ordenador.<\/p>\n<p>En este punto podemos centrarnos en el c\u00f3digo de Angular 2 que puede que hayas visto antes o puede que no.<\/p>\n<h3 id=\"developing-a-pouchdb-provider-for-angular-2\">Desarrollo de un proveedor de PouchDB para Angular 2<\/h3>\n<p>Es una buena pr\u00e1ctica mantener el c\u00f3digo relacionado con los datos separado de la l\u00f3gica de la p\u00e1gina. En Angular 2 podemos lograr esta separaci\u00f3n mediante el uso de un proveedor compartido.<\/p>\n<p>Para crear un proveedor en Ionic 2, ejecuta lo siguiente desde la CLI:<\/p>\n<pre><code>proveedor de ionic g pouchdb-provider<\/code><\/pre>\n<p>Deber\u00edas acabar con <strong>src\/providers\/pouchdb-provider.ts<\/strong> o similar. El nombre no es realmente importante siempre que recuerdes lo que es.<\/p>\n<p>Abra el archivo del proveedor e incluya el siguiente TypeScript:<\/p>\n<pre><code>import { Injectable, EventEmitter } from '@angular\/core';\r\nvar PouchDB = require(\"pouchdb\");\r\n\r\n@Injectable()\r\nexport class PouchDBProvider {\r\n\r\n    private isInstantiated: boolean;\r\n    private database: any;\r\n    private listener: EventEmitter = new EventEmitter();\r\n\r\n    public constructor() { }\r\n\r\n    public get(id: string) { }\r\n\r\n    public put(document: any, id: string) { }\r\n\r\n    public sync(remote: string) { }\r\n\r\n    public getChangeListener() { }\r\n\r\n}<\/code><\/pre>\n<p>El proveedor se inyectar\u00e1 en varias p\u00e1ginas y emitir\u00e1 cambios, de ah\u00ed que la etiqueta <code>Inyectable<\/code> y <code>Emisor de eventos<\/code> importaciones. Tambi\u00e9n estamos importando la biblioteca PouchDB JavaScript.<\/p>\n<p>El proveedor actuar\u00e1 como un singleton con una instancia de base de datos abierta mientras nuestra aplicaci\u00f3n est\u00e9 abierta. Esta configuraci\u00f3n se puede crear en el archivo <code>constructor<\/code> m\u00e9todo:<\/p>\n<pre><code>public constructor() {\r\n    if(!this.isInstantiated) {\r\n        this.database = new PouchDB(\"nraboy\");\r\n        this.database.changes({\r\n            live: true,\r\n            include_docs: true\r\n        }).on('change', change =&gt; {\r\n            this.listener.emit(change);\r\n        });\r\n        this.isInstantiated = true;\r\n    }\r\n}<\/code><\/pre>\n<p>En el <code>constructor<\/code> si la base de datos no est\u00e1 ya instanciada, la instanciaremos, la abriremos y configuraremos los eventos de cambio. Por cada cambio contra la base de datos los emitiremos y eventualmente los recogeremos suscribi\u00e9ndonos al listener.<\/p>\n<p>Digamos que queremos obtener un documento NoSQL en particular por su id. Podemos crear una funci\u00f3n como la siguiente:<\/p>\n<pre><code>public get(id: cadena) {\r\n    return this.database.get(id);\r\n}<\/code><\/pre>\n<p>Para esta aplicaci\u00f3n en particular, el m\u00e9todo anterior es m\u00e1s \u00fatil para nuestro m\u00e9todo de creaci\u00f3n de documentos, ya que queremos ver si un documento existe antes de intentar actualizarlo:<\/p>\n<pre><code>public put(document: any, id: string) {\r\n    document._id = id;\r\n    return this.get(id).then(result =&gt; {\r\n        document._rev = result._rev;\r\n        return this.database.put(document);\r\n    }, error =&gt; {\r\n        if(error.status == \"404\") {\r\n            return this.database.put(document);\r\n        } else {\r\n            return new Promise((resolve, reject) =&gt; {\r\n                reject(error);\r\n            });\r\n        }\r\n    });\r\n}<\/code><\/pre>\n<p>Si el documento no existe, se crear\u00e1 en lugar de actualizarse.<\/p>\n<p>Como el objetivo aqu\u00ed es usar Couchbase en nuestra aplicaci\u00f3n Electron de escritorio, necesitamos tener una funci\u00f3n de sincronizaci\u00f3n:<\/p>\n<pre><code>public sync(remoto: cadena) {\r\n    let baseDatosRemota = new PouchDB(remota);\r\n    this.database.sync(baseDatosRemota, {\r\n        live: true\r\n        reintentar: true\r\n    });\r\n}<\/code><\/pre>\n<p>En <code>sincronizar<\/code> tomar\u00e1 el nombre de host y la base de datos de nuestro Sync Gateway y realizar\u00e1 una sincronizaci\u00f3n bidireccional entre nuestra base de datos local y la base de datos remota.<\/p>\n<pre><code>public getChangeListener() {\r\n    return this.listener;\r\n}<\/code><\/pre>\n<p>Por \u00faltimo, proporcionamos una forma de obtener y suscribirse al receptor de cambios.<\/p>\n<p>El proveedor PouchDB est\u00e1 hecho, pero no est\u00e1 listo para ser usado. Para usarlo en cada una de nuestras p\u00e1ginas necesitamos a\u00f1adirlo a la aplicaci\u00f3n <code>@NgModule<\/code> que se encuentra en el bloque <strong>src\/app\/app.module.ts<\/strong> archivo. Abra este archivo e incluya lo siguiente:<\/p>\n<pre><code>import { NgModule, ErrorHandler } from '@angular\/core';\r\nimport { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';\r\nimport { MyApp } from '.\/app.component';\r\nimport { HomePage } from '..\/pages\/home\/home';\r\nimport { PouchDBProvider } from \"..\/providers\/pouchdb-provider\";\r\n\r\n@NgModule({\r\n    declarations: [\r\n        MyApp,\r\n        HomePage\r\n    ],\r\n    imports: [\r\n        IonicModule.forRoot(MyApp)\r\n    ],\r\n    bootstrap: [IonicApp],\r\n    entryComponents: [\r\n        MyApp,\r\n        HomePage\r\n    ],\r\n    providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, PouchDBProvider]\r\n})\r\nexport class AppModule {}<\/code><\/pre>\n<p>B\u00e1sicamente, s\u00f3lo importamos el proveedor y lo a\u00f1adimos a la carpeta <code>proveedores<\/code> de la <code>@NgModule<\/code> bloque. Ahora el proveedor se puede utilizar en las p\u00e1ginas de nuestra aplicaci\u00f3n.<\/p>\n<h3 id=\"adding-the-page-logic-for-a-functional-application\">A\u00f1adir la l\u00f3gica de p\u00e1gina para una aplicaci\u00f3n funcional<\/h3>\n<p>Esta aplicaci\u00f3n en particular s\u00f3lo tiene una pantalla y esa pantalla es bastante simple. Muestra una lista de datos y permite introducir nuevos datos.<\/p>\n<p>Empezando por la l\u00f3gica TypeScript, abra el archivo <strong>src\/pages\/home\/home.ts<\/strong> e incluya lo siguiente:<\/p>\n<pre><code>import { Component, NgZone } from '@angular\/core';\r\nimport { NavController, AlertController } from 'ionic-angular';\r\nimport { PouchDBProvider } from \"..\/..\/providers\/pouchdb-provider\";\r\nimport * as Uuid from \"uuid\";\r\n\r\n@Component({\r\n    selector: 'page-home',\r\n    templateUrl: 'home.html'\r\n})\r\nexport class HomePage {\r\n\r\n    public items: Array;\r\n\r\n    public constructor(public navCtrl: NavController, public alertCtrl: AlertController, private zone: NgZone, private database: PouchDBProvider) {\r\n        this.items = [];\r\n    }\r\n\r\n    public ionViewDidEnter() { }\r\n\r\n    public insert() { }\r\n\r\n}<\/code><\/pre>\n<p>Hemos importado varios componentes de Angular 2, Ionic 2 y personalizados en la p\u00e1gina y hemos inyectado muchos de ellos en el componente <code>constructor<\/code> m\u00e9todo. En <code>art\u00edculos<\/code> contendr\u00e1 los datos sincronizados que se mostrar\u00e1n en la pantalla. El <code>constructor<\/code> s\u00f3lo inicializa nuestras variables.<\/p>\n<p>Para cargar datos en nuestras variables debemos utilizar el m\u00e9todo <code>ionViewDidEnter<\/code> m\u00e9todo:<\/p>\n<pre><code>public ionViewDidEnter() {\r\n    this.database.sync(\"https:\/\/192.168.57.1:4984\/example\");\r\n    this.database.getChangeListener().subscribe(data =&gt; {\r\n        this.zone.run(() =&gt; {\r\n            this.items.push(data.doc);\r\n        });\r\n    });\r\n}<\/code><\/pre>\n<p>En el <code>ionViewDidEnter<\/code> estamos iniciando la sincronizaci\u00f3n con nuestro Sync Gateway y suscribi\u00e9ndonos a los eventos de cambio. A medida que se produzcan cambios, se a\u00f1adir\u00e1n a la base de datos <code>art\u00edculos<\/code> matriz. Estamos utilizando <code>NgZone<\/code> porque los escuchadores de cambios son dudosos en Angular 2 y queremos garantizar que la interfaz de usuario se actualiza correctamente.<\/p>\n<p>En <code>insertar<\/code> es pr\u00e1cticamente toda la l\u00f3gica de Ionic 2:<\/p>\n<pre><code>public insert() {\r\n    let prompt = this.alertCtrl.create({\r\n        title: 'Todo Items',\r\n        message: \"Add a new item to the todo list\",\r\n        inputs: [\r\n            {\r\n                name: 'title',\r\n                placeholder: 'Title'\r\n            },\r\n        ],\r\n        buttons: [\r\n            {\r\n                text: 'Cancel',\r\n                handler: data =&gt; {}\r\n            },\r\n            {\r\n                text: 'Save',\r\n                handler: data =&gt; {\r\n                    if(data.title) {\r\n                        this.database.put({type: \"list\", title: data.title}, Uuid.v4());\r\n                    }\r\n                }\r\n            }\r\n        ]\r\n    });\r\n    prompt.present();\r\n}<\/code><\/pre>\n<p>Cuando se llama al m\u00e9todo, se mostrar\u00e1 un mensaje para que el usuario introduzca los datos. Cuando se guarden, los datos se guardar\u00e1n como un documento en PouchDB y se sincronizar\u00e1n con Couchbase Server.<\/p>\n<h3 id=\"designing-the-user-interface\">Dise\u00f1o de la interfaz de usuario<\/h3>\n<p>La interfaz de usuario detr\u00e1s de la l\u00f3gica TypeScript es corta y dulce. Abra el proyecto <strong>src\/pages\/home\/home.html<\/strong> e incluya el siguiente c\u00f3digo HTML:<\/p>\n<pre><code>&lt;ion-header&gt;\r\n    &lt;ion-navbar&gt;\r\n        &lt;ion-title&gt;\r\n            Electron w\/ Couchbase\r\n        &lt;\/ion-title&gt;\r\n        &lt;ion-buttons end&gt;\r\n            &lt;button ion-button icon-only (click)=\"insert()\"&gt;\r\n                &lt;ion-icon name=\"add\"&gt;&lt;\/ion-icon&gt;\r\n            &lt;\/button&gt;\r\n        &lt;\/ion-buttons&gt;\r\n    &lt;\/ion-navbar&gt;\r\n&lt;\/ion-header&gt;\r\n\r\n&lt;ion-content padding&gt;\r\n    &lt;ion-list&gt;\r\n        &lt;ion-item *ngFor=\"let item of items\"&gt;\r\n            {{ item.title }}\r\n        &lt;\/ion-item&gt;\r\n    &lt;\/ion-list&gt;\r\n&lt;\/ion-content&gt;<\/code><\/pre>\n<p>La interfaz de usuario tiene una barra de acci\u00f3n con un bot\u00f3n que ejecutar\u00e1 el programa <code>insertar<\/code> cuando se pulsa. El contenido de la pantalla es una lista que muestra cada elemento de la lista <code>art\u00edculos<\/code> como una fila.<\/p>\n<h2 id=\"seeing-the-project-in-action\">Ver el proyecto en acci\u00f3n<\/h2>\n<p><code><\/code>Hicimos muchas cosas en el ejemplo de Electron con Couchbase. He <a href=\"https:\/\/github.com\/couchbaselabs\/todolite-electron-pouchdb\">cargado un proyecto de trabajo<\/a> en GitHub si quieres probarlo.<\/p>\n<p>Descargue el proyecto y ejecute el siguiente comando:<\/p>\n<pre><code>npm instalar<\/code><\/pre>\n<p>El comando anterior restaurar todas las dependencias del proyecto. Con Sync Gateway en marcha, ejecute lo siguiente para ejecutar la aplicaci\u00f3n con Electron:<\/p>\n<pre><code>npm run electron<\/code><\/pre>\n<p>Tenga en cuenta que probablemente tendr\u00e1 que cambiar el host de Sync Gateway en el archivo <strong>src\/pages\/home\/home.ts<\/strong> para que coincida con su nombre de host.<\/p>\n<h2 id=\"conclusion\">Conclusi\u00f3n<\/h2>\n<p>Acabas de ver c\u00f3mo crear una aplicaci\u00f3n de escritorio que se sincroniza con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\">Couchbase<\/a>. Esta aplicaci\u00f3n funciona con <a href=\"https:\/\/electron.atom.io\/\">Electr\u00f3n<\/a>pero utiliza Angular 2 y PouchDB. Aunque la capa de interfaz de usuario era Ionic 2, no ten\u00eda por qu\u00e9 serlo. Puedes usar tu propio framework de UI como Bootstrap o similar. El objetivo aqu\u00ed era m\u00e1s bien demostrar Electron con Couchbase y Angular 2. Esta gu\u00eda fue un paso adelante de mi anterior sobre el tema de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/build-a-desktop-app-with-github-electron-and-couchbase\/\">AngularJS 1.0 con Couchbase y Electron<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been on a role when it comes to JavaScript and Couchbase. Over the past few weeks I&#8217;ve been creating content revolving around the Angular 2 framework, the JavaScript library PouchDB, and Ionic Framework for mobile. What I haven&#8217;t explored [&hellip;]<\/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,1810,9327],"tags":[1578,1549,1773,1543,1541],"ppma_author":[9032],"class_list":["post-2482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-mobile","category-javascript","tag-angular-2","tag-electron","tag-ionic-2","tag-javascript","tag-pouchdb"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Desktop App using Electron, PouchDB, Ionic 2 &amp; Couchbase<\/title>\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-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase\" \/>\n<meta property=\"og:description\" content=\"I&#8217;ve been on a role when it comes to JavaScript and Couchbase. Over the past few weeks I&#8217;ve been creating content revolving around the Angular 2 framework, the JavaScript library PouchDB, and Ionic Framework for mobile. What I haven&#8217;t explored [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\" \/>\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=\"2017-01-07T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:15:32+00:00\" \/>\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=\"10 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-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase\",\"datePublished\":\"2017-01-07T15:00:00+00:00\",\"dateModified\":\"2025-06-14T03:15:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\"},\"wordCount\":1609,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"angular 2\",\"electron\",\"ionic 2\",\"javascript\",\"pouchdb\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Mobile\",\"JavaScript\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\",\"name\":\"Desktop App using Electron, PouchDB, Ionic 2 & Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-07T15:00:00+00:00\",\"dateModified\":\"2025-06-14T03:15:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#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-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase\"}]},{\"@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":"Desktop App using Electron, PouchDB, Ionic 2 & Couchbase","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-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase","og_description":"I&#8217;ve been on a role when it comes to JavaScript and Couchbase. Over the past few weeks I&#8217;ve been creating content revolving around the Angular 2 framework, the JavaScript library PouchDB, and Ionic Framework for mobile. What I haven&#8217;t explored [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-01-07T15:00:00+00:00","article_modified_time":"2025-06-14T03:15:32+00:00","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":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase","datePublished":"2017-01-07T15:00:00+00:00","dateModified":"2025-06-14T03:15:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/"},"wordCount":1609,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["angular 2","electron","ionic 2","javascript","pouchdb"],"articleSection":["Best Practices and Tutorials","Couchbase Mobile","JavaScript"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/","name":"Desktop App using Electron, PouchDB, Ionic 2 & Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-07T15:00:00+00:00","dateModified":"2025-06-14T03:15:32+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/create-a-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#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-desktop-app-that-syncs-using-electron-pouchdb-ionic-2-and-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Create a Desktop App that Syncs using Electron, PouchDB, Ionic 2 and Couchbase"}]},{"@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\/2482","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=2482"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2482\/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=2482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2482"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}