{"id":3761,"date":"2017-07-04T08:00:57","date_gmt":"2017-07-04T15:00:57","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3761"},"modified":"2025-06-13T20:52:44","modified_gmt":"2025-06-14T03:52:44","slug":"couchbase-meetup-project-nativescript-angular-nosql-development-available","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/","title":{"rendered":"Meetup de Proyecto Couchbase sobre NativeScript, Angular y desarrollo NoSQL disponible"},"content":{"rendered":"<p>Hace poco organic\u00e9 un <a href=\"https:\/\/www.meetup.com\/Couchbase-Silicon-Valley\/events\/237585340\/\" target=\"_blank\" rel=\"noopener noreferrer\">Meetup de Couchbase<\/a> en Mountain View, California, sobre el tema de NativeScript, Angular y desarrollo NoSQL. Con un invitado especial, <a href=\"https:\/\/twitter.com\/tjvantoll\" target=\"_blank\" rel=\"noopener noreferrer\">TJ VanToll<\/a> de Progress, hablamos del desarrollo de aplicaciones m\u00f3viles y de c\u00f3mo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> para el almacenamiento NoSQL y la sincronizaci\u00f3n de datos.<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3763 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/couchbase-meetup-june-2017.jpg\" alt=\"Couchbase MV Meetup June 2017\" width=\"1100\" height=\"537\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/couchbase-meetup-june-2017.jpg 1100w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/couchbase-meetup-june-2017-300x146.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/couchbase-meetup-june-2017-1024x500.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/couchbase-meetup-june-2017-768x375.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/couchbase-meetup-june-2017-20x10.jpg 20w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p>Hubo una buena asistencia al evento y, a petici\u00f3n popular, quise compartir y revisar el c\u00f3digo utilizado para hacer posible el proyecto Couchbase.<\/p>\n<p>Suponiendo que tienes el CLI NativeScript y Xcode o el SDK de Android instalado y configurado en tu m\u00e1quina, podemos crear un nuevo proyecto desde el s\u00edmbolo del sistema o Terminal:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">tns create couchbase-project --ng<\/pre>\n<p>En\u00a0<code>--ng<\/code> en el comando anterior indica que estamos creando un proyecto Angular en lugar de un proyecto Core.<\/p>\n<p>El proyecto que crearemos constar\u00e1 de dos p\u00e1ginas y un servicio de datos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3762 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/ns-couchbase-meetup-example.gif\" alt=\"Couchbase with NativeScript Meetup Example\" width=\"1100\" height=\"706\" \/><\/p>\n<p>Dentro de la aplicaci\u00f3n podr\u00e1s mostrar una lista de pel\u00edculas almacenadas en tu base de datos, as\u00ed como a\u00f1adir pel\u00edculas a esa base de datos. Todo esto se gestiona a trav\u00e9s del servicio de datos. Con Couchbase Sync Gateway disponible, la sincronizaci\u00f3n podr\u00e1 ocurrir.<\/p>\n<p>A\u00f1ade los siguientes directorios y archivos a tu nuevo proyecto NativeScript:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">mkdir -p app\/components\/create\r\nmkdir -p app\/components\/list\r\nmkdir -p app\/providers\r\ntouch app\/components\/create\/create.component.ts\r\ntouch app\/components\/create\/create.component.html\r\ntouch app\/components\/list\/list.component.ts\r\ntouch app\/components\/list\/list.component.html\r\ntouch app\/providers\/database.service.ts<\/pre>\n<p>En el desarrollo Angular, cada componente tendr\u00e1 un archivo TypeScript y HTML. Cada servicio solo tendr\u00e1 un archivo TypeScript.<\/p>\n<p>Empecemos dise\u00f1ando nuestro servicio de datos que manejar\u00e1 las interacciones con la base de datos Couchbase Lite instalada localmente. Abre el archivo\u00a0<strong>app\/providers\/database.service.ts<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">import { Injectable, EventEmitter } from \"@angular\/core\";\r\nimport { Couchbase } from \"nativescript-couchbase\";\r\n\r\n@Injectable()\r\nexport class DatabaseService {\r\n\r\n    private database: any;\r\n    private pushReplicator: any;\r\n    private pullReplicator: any;\r\n    private listener: EventEmitter&lt;any&gt; = new EventEmitter();\r\n\r\n    public constructor() {\r\n        this.database = new Couchbase(\"movie-db\");\r\n        this.database.createView(\"movies\", \"1\", function(document, emitter) {\r\n            if(document.type == \"movie\") {\r\n                emitter.emit(document._id, document);\r\n            }\r\n        });\r\n    }\r\n\r\n    public query(viewName: string): Array&lt;any&gt; {\r\n        return this.database.executeQuery(viewName);\r\n    }\r\n\r\n    public startReplication(gateway: string, bucket: string) {\r\n        this.pushReplicator = this.database.createPushReplication(\"https:\/\/\" + gateway + \":4984\/\" + bucket);\r\n        this.pullReplicator = this.database.createPullReplication(\"https:\/\/\" + gateway + \":4984\/\" + bucket);\r\n        this.pushReplicator.setContinuous(true);\r\n        this.pullReplicator.setContinuous(true);\r\n        this.database.addDatabaseChangeListener(changes =&gt; {\r\n            this.listener.emit(changes);\r\n        });\r\n        this.pushReplicator.start();\r\n        this.pullReplicator.start();\r\n    }\r\n\r\n    public getDatabase() {\r\n        return this.database;\r\n    }\r\n\r\n    public getChangeListener() {\r\n        return this.listener;\r\n    }\r\n\r\n}<\/pre>\n<p>En el servicio anterior ocurren muchas cosas, as\u00ed que deber\u00edamos desglosarlas.<\/p>\n<p>Despu\u00e9s de importar todas las dependencias de los componentes y definir nuestras variables, tenemos nuestro\u00a0<code>constructor<\/code> m\u00e9todo:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">public constructor() {\r\n    this.database = new Couchbase(\"movie-db\");\r\n    this.database.createView(\"movies\", \"1\", function(document, emitter) {\r\n        if(document.type == \"movie\") {\r\n            emitter.emit(document._id, document);\r\n        }\r\n    });\r\n}<\/pre>\n<p>En el\u00a0<code>constructor<\/code> creamos y abrimos la base de datos NoSQL de Couchbase y creamos una vista que se utilizar\u00e1 para consultar los datos. La l\u00f3gica de la vista dice que cuando se consulte, devuelva un par clave-valor por cada documento que tenga una propiedad llamada\u00a0<code>tipo<\/code> que es igual a\u00a0<code>pel\u00edcula<\/code>. Cualquier otro documento que no cumpla esta condici\u00f3n no se incluir\u00e1 en los resultados.<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">public query(viewName: string): Array&lt;any&gt; {\r\n    return this.database.executeQuery(viewName);\r\n}<\/pre>\n<p>Al consultar la vista, recibiremos un array de resultados que podemos elegir para mostrar en pantalla. Esto es algo que haremos en el componente apropiado.<\/p>\n<p>Para aprovechar el poder y la maravilla de Couchbase, queremos tener soporte de replicaci\u00f3n \/ sincronizaci\u00f3n dentro de la aplicaci\u00f3n. Dentro de la\u00a0<code>startReplication<\/code> tenemos lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">public startReplication(gateway: string, bucket: string) {\r\n    this.pushReplicator = this.database.createPushReplication(\"https:\/\/\" + gateway + \":4984\/\" + bucket);\r\n    this.pullReplicator = this.database.createPullReplication(\"https:\/\/\" + gateway + \":4984\/\" + bucket);\r\n    this.pushReplicator.setContinuous(true);\r\n    this.pullReplicator.setContinuous(true);\r\n    this.database.addDatabaseChangeListener(changes =&gt; {\r\n        this.listener.emit(changes);\r\n    });\r\n    this.pushReplicator.start();\r\n    this.pullReplicator.start();\r\n}<\/pre>\n<p>Si proporcionamos la informaci\u00f3n de nuestra instancia de Couchbase Sync Gateway, podemos replicar los datos en ambas direcciones continuamente. Como la aplicaci\u00f3n m\u00f3vil nunca lee los datos remotos, configuramos un escuchador de cambios cuando los datos locales cambian. Estos cambios se emiten a trav\u00e9s de un emisor Angular.<\/p>\n<p>Para poder inyectar este servicio de datos en cada uno de nuestros componentes, tenemos que importarlo en el directorio del proyecto\u00a0<code>@NgModule<\/code> bloque. Abra el archivo\u00a0<strong>app\/app.module.ts<\/strong> y que tenga el siguiente aspecto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">import { NgModule, NO_ERRORS_SCHEMA } from \"@angular\/core\";\r\nimport { NativeScriptModule } from \"nativescript-angular\/nativescript.module\";\r\nimport { NativeScriptFormsModule } from \"nativescript-angular\/forms\";\r\nimport { AppRoutingModule } from \".\/app.routing\";\r\nimport { AppComponent } from \".\/app.component\";\r\n\r\nimport { ListComponent } from \".\/components\/list\/list.component\";\r\nimport { CreateComponent } from \".\/components\/create\/create.component\";\r\nimport { DatabaseService } from \".\/providers\/database.service\";\r\n\r\n@NgModule({\r\n    bootstrap: [\r\n        AppComponent\r\n    ],\r\n    imports: [\r\n        NativeScriptModule,\r\n        NativeScriptFormsModule,\r\n        AppRoutingModule\r\n    ],\r\n    declarations: [\r\n        AppComponent,\r\n        ListComponent,\r\n        CreateComponent\r\n    ],\r\n    providers: [DatabaseService],\r\n    schemas: [\r\n        NO_ERRORS_SCHEMA\r\n    ]\r\n})\r\nexport class AppModule { }<\/pre>\n<p>Observe que el servicio se ha importado e incluido en el archivo\u00a0<code>proveedores<\/code> de la\u00a0<code>@NgModule<\/code> bloque. Adelant\u00e1ndonos, tambi\u00e9n hemos importado cada uno de los componentes que estamos creando.<\/p>\n<p>Ahora pasemos al componente para a\u00f1adir nuevas pel\u00edculas a la base de datos. Abra el proyecto\u00a0<strong>app\/components\/create\/create.component.ts<\/strong> e incluya el siguiente c\u00f3digo TypeScript:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">import { Component } from \"@angular\/core\";\r\nimport { Location } from \"@angular\/common\";\r\nimport { DatabaseService } from \"..\/..\/providers\/database.service\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: \"ns-create\",\r\n    templateUrl: \"create.component.html\",\r\n})\r\nexport class CreateComponent {\r\n\r\n    private database: any;\r\n    public input: any;\r\n\r\n    public constructor(private location: Location, private couchbase: DatabaseService) {\r\n        this.database = this.couchbase.getDatabase();\r\n        this.input = {\r\n            \"title\": \"\",\r\n            \"genre\": \"\",\r\n            \"type\": \"movie\"\r\n        }\r\n    }\r\n\r\n    public save() {\r\n        if(this.input.title &amp;&amp; this.input.genre) {\r\n            this.database.createDocument(this.input);\r\n            this.location.back();\r\n        }\r\n    }\r\n\r\n}<\/pre>\n<p>En el c\u00f3digo anterior estamos inyectando el archivo\u00a0<code>Servicio de base de datos<\/code> creado previamente junto con el Angular\u00a0<code>Ubicaci\u00f3n<\/code> servicio. Utilizando el\u00a0<code>Servicio de base de datos<\/code> podemos obtener la instancia de la base de datos y guardar el\u00a0<code>entrada<\/code> objeto cuando el\u00a0<code>guardar<\/code> . La direcci\u00f3n\u00a0<code>entrada<\/code> est\u00e1 vinculado a un formulario de la interfaz de usuario.<\/p>\n<p>La interfaz de usuario de este componente puede describirse en el proyecto\u00a0<strong>app\/components\/create\/create.component.html<\/strong> file:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">&lt;ActionBar title=\"{N} Couchbase Example\"&gt;\r\n    &lt;ActionItem text=\"Save\" ios.position=\"right\" (tap)=\"save()\"&gt;&lt;\/ActionItem&gt;\r\n&lt;\/ActionBar&gt;\r\n&lt;StackLayout class=\"form\"&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Movie Title\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.title\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n    &lt;StackLayout class=\"input-field\"&gt;\r\n        &lt;Label text=\"Movie Genre\" class=\"label font-weight-bold m-b-5\"&gt;&lt;\/Label&gt;\r\n        &lt;TextField class=\"input\" [(ngModel)]=\"input.genre\"&gt;&lt;\/TextField&gt;\r\n        &lt;StackLayout class=\"hr-light\"&gt;&lt;\/StackLayout&gt;\r\n    &lt;\/StackLayout&gt;\r\n&lt;\/StackLayout&gt;<\/pre>\n<p>En el XML anterior, observe los dos\u00a0<code>Campo de texto<\/code> est\u00e1n vinculadas a las etiquetas\u00a0<code>entrada<\/code> mediante la variable Angular\u00a0<code>ngModel<\/code> atributos.<\/p>\n<p>La parte final de la aplicaci\u00f3n NativeScript consiste en listar las pel\u00edculas que est\u00e1n en nuestra base de datos. Abre el archivo\u00a0<strong>app\/components\/list\/list.component.ts<\/strong> e incluya el siguiente c\u00f3digo TypeScript:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">import { Component, NgZone, OnInit } from \"@angular\/core\";\r\nimport { Location } from \"@angular\/common\";\r\nimport { isAndroid } from \"platform\";\r\nimport { DatabaseService } from \"..\/..\/providers\/database.service\";\r\n\r\n@Component({\r\n    moduleId: module.id,\r\n    selector: \"ns-list\",\r\n    templateUrl: \"list.component.html\",\r\n})\r\nexport class ListComponent implements OnInit {\r\n\r\n    public movies: Array&lt;any&gt;;\r\n\r\n    public constructor(private location: Location, private zone: NgZone, private couchbase: DatabaseService) {\r\n        this.movies = [];\r\n    }\r\n\r\n    public ngOnInit() {\r\n        this.location.subscribe(() =&gt; {\r\n            this.movies = this.couchbase.query(\"movies\");\r\n        });\r\n        this.movies = this.couchbase.query(\"movies\");\r\n        this.couchbase.startReplication(isAndroid ? \"10.0.2.2\" : \"localhost\", \"movie-db\");\r\n        this.couchbase.getChangeListener().subscribe(data =&gt; {\r\n            for (let i = 0; i &lt; data.length; i++) {\r\n                let documentId = data[i].getDocumentId();\r\n                let document = this.couchbase.getDatabase().getDocument(documentId);\r\n                this.zone.run(() =&gt; {\r\n                    this.movies.push(document);\r\n                });\r\n            }\r\n        });\r\n    }\r\n\r\n}<\/pre>\n<p>De nuevo, estamos inyectando el\u00a0<code>Servicio de base de datos<\/code>,\u00a0<code>Ubicaci\u00f3n<\/code>y\u00a0<code>NgZone<\/code> en el componente\u00a0<code>constructor<\/code> m\u00e9todo.<\/p>\n<p>Nunca es una buena idea cargar datos en el\u00a0<code>constructor<\/code> por lo que utilizaremos el m\u00e9todo\u00a0<code>ngOnInit<\/code> en su lugar:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">public ngOnInit() {\r\n    this.location.subscribe(() =&gt; {\r\n        this.movies = this.couchbase.query(\"movies\");\r\n    });\r\n    this.movies = this.couchbase.query(\"movies\");\r\n    this.couchbase.startReplication(isAndroid ? \"10.0.2.2\" : \"localhost\", \"movie-db\");\r\n    this.couchbase.getChangeListener().subscribe(data =&gt; {\r\n        for (let i = 0; i &lt; data.length; i++) {\r\n            let documentId = data[i].getDocumentId();\r\n            let document = this.couchbase.getDatabase().getDocument(documentId);\r\n            this.zone.run(() =&gt; {\r\n                this.movies.push(document);\r\n            });\r\n        }\r\n    });\r\n}<\/pre>\n<p>Est\u00e1n ocurriendo algunas cosas en el\u00a0<code>ngOnInit<\/code> m\u00e9todo. Queremos cargar los datos de la base de datos, pero hay que hacerlo de dos maneras diferentes. Necesitamos cargar los datos al abrir la aplicaci\u00f3n y necesitamos cargar los datos al navegar hacia atr\u00e1s desde la pantalla de creaci\u00f3n.<\/p>\n<p>Porque el\u00a0<code>ngOnInit<\/code> no se dispara al navegar hacia atr\u00e1s, necesitamos suscribirnos a los eventos de localizaci\u00f3n. En ambos escenarios consultamos la vista que hab\u00edamos creado.<\/p>\n<p>Dado que queremos soporte de sincronizaci\u00f3n, podemos llamar a la funci\u00f3n\u00a0<code>startReplication<\/code> y pase la informaci\u00f3n de la puerta de enlace de sincronizaci\u00f3n. Si est\u00e1 realizando pruebas localmente, aseg\u00farese de proporcionar la informaci\u00f3n de host adecuada para Android e iOS.<\/p>\n<p>Mientras se escuchan los cambios, cualquier dato que llegue debe buscarse por id y a\u00f1adirse a la lista.<\/p>\n<p>La interfaz de usuario que se empareja con el componente para listar pel\u00edculas se puede encontrar en la secci\u00f3n\u00a0<strong>app\/components\/list\/list.component.html<\/strong> file:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">&lt;ActionBar title=\"{N} Couchbase Example\"&gt;\r\n    &lt;ActionItem text=\"Add\" ios.position=\"right\" [nsRouterLink]=\"['\/create']\"&gt;&lt;\/ActionItem&gt;\r\n&lt;\/ActionBar&gt;\r\n&lt;GridLayout&gt;\r\n    &lt;ListView [items]=\"movies\" class=\"list-group\"&gt;\r\n        &lt;ng-template let-movie=\"item\"&gt;\r\n            &lt;StackLayout class=\"list-group-item\"&gt;\r\n                &lt;Label text=\"{{ movie.title }}\" class=\"h2\"&gt;&lt;\/Label&gt;\r\n                &lt;Label text=\"{{ movie.genre }}\"&gt;&lt;\/Label&gt;\r\n            &lt;\/StackLayout&gt;\r\n        &lt;\/ng-template&gt;\r\n    &lt;\/ListView&gt;\r\n&lt;\/GridLayout&gt;<\/pre>\n<p>En el XML anterior, tenemos un simple\u00a0<code>ListView<\/code> donde cada fila contiene informaci\u00f3n de los objetos que estamos almacenando en Couchbase.<\/p>\n<p>Llevando la aplicaci\u00f3n NativeScript a su fin, tenemos que arreglar nuestro archivo de enrutamiento que es responsable de la navegaci\u00f3n. Abre el archivo\u00a0<strong>app\/app.routing.ts<\/strong> e incluir el siguiente TypeScript:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">import { NgModule } from \"@angular\/core\";\r\nimport { NativeScriptRouterModule } from \"nativescript-angular\/router\";\r\nimport { Routes } from \"@angular\/router\";\r\n\r\nimport { ListComponent } from \".\/components\/list\/list.component\";\r\nimport { CreateComponent } from \".\/components\/create\/create.component\";\r\n\r\nconst routes: Routes = [\r\n    { path: \"\", redirectTo: \"\/list\", pathMatch: \"full\" },\r\n    { path: \"list\", component: ListComponent },\r\n    { path: \"create\", component: CreateComponent }\r\n];\r\n\r\n@NgModule({\r\n    imports: [NativeScriptRouterModule.forRoot(routes)],\r\n    exports: [NativeScriptRouterModule]\r\n})\r\nexport class AppRoutingModule { }<\/pre>\n<p>En el c\u00f3digo anterior s\u00f3lo estamos importando los dos componentes y list\u00e1ndolos como posibles rutas dentro de la aplicaci\u00f3n. M\u00e1s informaci\u00f3n sobre el enrutamiento con una aplicaci\u00f3n NativeScript con Angular se puede encontrar en un art\u00edculo anterior que escrib\u00ed titulado,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2016\/10\/navigating-nativescript-app-angular-2-router\/\" target=\"_blank\" rel=\"noopener noreferrer\">Navegaci\u00f3n de una aplicaci\u00f3n NativeScript con el router Angular<\/a>.<\/p>\n<p>Recuerde, nuestro proyecto no s\u00f3lo consiste en NativeScript, sino que tambi\u00e9n consiste en Sync Gateway que es una entidad separada. Tenemos que definir un archivo de configuraci\u00f3n sobre c\u00f3mo debe funcionar la sincronizaci\u00f3n.<\/p>\n<p>Crea un archivo llamado,\u00a0<strong>sync-gateway-config.json<\/strong> e incluyen lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">{\r\n    \"log\":[\"CRUD+\", \"REST+\", \"Changes+\", \"Attach+\"],\r\n    \"databases\": {\r\n        \"movie-db\": {\r\n            \"server\":\"walrus:data\",\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}<\/pre>\n<p>Al lanzar Couchbase Sync Gateway, se debe utilizar la configuraci\u00f3n anterior. Es s\u00f3lo un ejemplo b\u00e1sico de lo que puedes lograr con la sincronizaci\u00f3n de datos.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Personalmente creo <a href=\"https:\/\/www.nativescript.org\" target=\"_blank\" rel=\"noopener noreferrer\">NativeScript<\/a> es una gran tecnolog\u00eda para el desarrollo m\u00f3vil. Al utilizar el plugin de Couchbase para NativeScript, que cuenta con el apoyo de la comunidad, puedes incluir NoSQL y soporte de sincronizaci\u00f3n de datos dentro de tu aplicaci\u00f3n.<\/p>\n<p>Si no est\u00e1 registrado en el <a href=\"https:\/\/www.meetup.com\/Couchbase-Silicon-Valley\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase Silicon Valley<\/a> y est\u00e1s en la zona de Mountain View, te recomiendo que te tomes un momento para registrarte. Si est\u00e1s interesado en ver m\u00e1s Couchbase con NativeScript en acci\u00f3n, echa un vistazo a un art\u00edculo anterior que escrib\u00ed sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/synchronizing-images-android-ios-nativescript-angular-couchbase\/\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre Couchbase Lite, consulte la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener noreferrer\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>I recently hosted a Couchbase Meetup in Mountain View, California, on the topic of NativeScript, Angular and NoSQL development. With special guest, TJ VanToll from Progress, we discussed mobile application development and how Couchbase can be included for NoSQL storage [&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":[2370,1815,1810,9327,2366],"tags":[1704,1536,1543,1589],"ppma_author":[9032],"class_list":["post-3761","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-best-practices-and-tutorials","category-couchbase-mobile","category-javascript","category-sync-gateway","tag-angular","tag-ios","tag-javascript","tag-nativescript"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase Meetup on NativeScript, Angular &amp; NoSQL<\/title>\n<meta name=\"description\" content=\"Learn how to develop mobile applications with NativeScript, Angular, and NoSQL with the project from the recent Couchbase Meetup in Mountain View.\" \/>\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\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available\" \/>\n<meta property=\"og:description\" content=\"Learn how to develop mobile applications with NativeScript, Angular, and NoSQL with the project from the recent Couchbase Meetup in Mountain View.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\" \/>\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-07-04T15:00:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:52:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/07\/Blog-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\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:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/07\/Blog-2.png\" \/>\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=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available\",\"datePublished\":\"2017-07-04T15:00:57+00:00\",\"dateModified\":\"2025-06-14T03:52:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\"},\"wordCount\":1105,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"ios\",\"javascript\",\"nativescript\"],\"articleSection\":[\"Android\",\"Best Practices and Tutorials\",\"Couchbase Mobile\",\"JavaScript\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\",\"name\":\"Couchbase Meetup on NativeScript, Angular & NoSQL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-07-04T15:00:57+00:00\",\"dateModified\":\"2025-06-14T03:52:44+00:00\",\"description\":\"Learn how to develop mobile applications with NativeScript, Angular, and NoSQL with the project from the recent Couchbase Meetup in Mountain View.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#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\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available\"}]},{\"@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":"Couchbase Meetup on NativeScript, Angular & NoSQL","description":"Aprende a desarrollar aplicaciones m\u00f3viles con NativeScript, Angular y NoSQL con el proyecto del reciente Meetup de Couchbase en Mountain View.","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\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/","og_locale":"es_MX","og_type":"article","og_title":"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available","og_description":"Learn how to develop mobile applications with NativeScript, Angular, and NoSQL with the project from the recent Couchbase Meetup in Mountain View.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-07-04T15:00:57+00:00","article_modified_time":"2025-06-14T03:52:44+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/07\/Blog-2.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/07\/Blog-2.png","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available","datePublished":"2017-07-04T15:00:57+00:00","dateModified":"2025-06-14T03:52:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/"},"wordCount":1105,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Angular","ios","javascript","nativescript"],"articleSection":["Android","Best Practices and Tutorials","Couchbase Mobile","JavaScript","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/","name":"Couchbase Meetup on NativeScript, Angular & NoSQL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-07-04T15:00:57+00:00","dateModified":"2025-06-14T03:52:44+00:00","description":"Aprende a desarrollar aplicaciones m\u00f3viles con NativeScript, Angular y NoSQL con el proyecto del reciente Meetup de Couchbase en Mountain View.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#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\/couchbase-meetup-project-nativescript-angular-nosql-development-available\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase Meetup Project on NativeScript, Angular, and NoSQL Development Available"}]},{"@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\/3761","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=3761"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3761\/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=3761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3761"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}