{"id":1917,"date":"2015-12-16T01:03:04","date_gmt":"2015-12-16T01:03:03","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1917"},"modified":"2023-10-06T00:03:18","modified_gmt":"2023-10-06T07:03:18","slug":"first-steps-with-pouchdb-sync-gateway-todomvc-todolite","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/","title":{"rendered":"Primeros pasos con PouchDB y Sync Gateway"},"content":{"rendered":"<p>Esta semana, <a href=\"https:\/\/pouchdb.com\/2015\/04\/07\/better-late-than-never.html\">PouchDB v3.4.0<\/a>\u00a0con compatibilidad con Couchbase Sync Gateway.<\/p>\n<p>En este post, tomaremos el ejemplo existente de \ufffcTodoMVC\ufffc y agregaremos sincronizaci\u00f3n filtrada usando autenticaci\u00f3n de Facebook. Adem\u00e1s de la sincronizaci\u00f3n entre los clientes Web, vamos a cambiar el modelo de datos ligeramente para sincronizar con las aplicaciones ToDoLite existentes que se ejecutan en <a style=\"font-family: sans-serif, Arial, Verdana, 'Trebuchet MS';line-height: 20.7999992370605px;text-align: left\" href=\"https:\/\/github.com\/couchbaselabs\/ToDoLite-iOS\">iOS\ufffc<\/a> y <a style=\"font-family: sans-serif, Arial, Verdana, 'Trebuchet MS';line-height: 20.7999992370605px;text-align: left\" href=\"https:\/\/github.com\/couchbaselabs\/ToDoLite-Android\">\ufffcAndroid<\/a>:<\/p>\n<p>Para seguir adelante, puedes abrir y ejecutar el ejemplo TodoMVC en commit \ufffc.<a href=\"https:\/\/github.com\/jamiltz\/getting-started-todo\/commit\/d9bb9612a611535898901feab9399610927fa9ed\">d9bb961<\/a>. Para mayor comodidad, he a\u00f1adido el c\u00f3digo de inicio de sesi\u00f3n de Facebook en <strong>app.js<\/strong>. Cuando el usuario inicia sesi\u00f3n, la funci\u00f3n <strong>startSessionAndSync(accessToken, userId)<\/strong>\u00a0se llama. \u00a1Ahora vamos a a\u00f1adir el c\u00f3digo para que esto suceda!<\/p>\n<h1>Inicio r\u00e1pido<\/h1>\n<p>Aseg\u00farate de servir la aplicaci\u00f3n en el puerto <strong>9000<\/strong>\u00a0ya que configuraremos CORS para <strong>localhost:9000<\/strong>\u00a0m\u00e1s tarde. El simple comando python debe hacer:<\/p>\n<pre>$ python -m SimpleHTTPServer 9000\r\n<\/pre>\n<h1>Modelizaci\u00f3n de datos<\/h1>\n<p>TodoMVC y ToDoLite tienen un modelo de datos ligeramente diferente. En las apps ToDoLite, un usuario puede crear m\u00faltiples listas y compartirlas con m\u00faltiples usuarios.<\/p>\n<p>En primer lugar, veamos un documento de Tarea con la informaci\u00f3n esperada <strong>t\u00edtulo<\/strong>\u00a0y una <strong>lista_id<\/strong>\u00a0haciendo referencia a la Lista a la que pertenece (en este caso 123):<\/p>\n<pre>{\r\n  \"_id\": \"E9W3-9I2Y-O8W2-6Y4D\",\r\n  \"type\": \"task\",\r\n  \"list_id\": \"123\",\r\n  \"title\": \"A task title\"\r\n}\r\n<\/pre>\n<p>Del mismo modo, un documento de Lista tambi\u00e9n tiene un <strong>t\u00edtulo<\/strong>\u00a0y un propietario que hace referencia al usuario al que pertenece:<\/p>\n<pre>{\r\n  \"_id\": \"123\",\r\n  \"type\": \"list\",\r\n  \"title\": \"TodoMVC list\",\r\n  \"owner\": \"p:1234567890\"\r\n}\r\n<\/pre>\n<p>TodoMVC sin embargo es una aplicaci\u00f3n de lista \u00fanica. Para mantener las cosas simples podemos insertar el documento de la lista en c\u00f3digo tan pronto como el usuario inicie sesi\u00f3n.<\/p>\n<p>Vamos a crear una nueva funci\u00f3n llamada <strong>migrateGuestToUser<\/strong> para crear el documento List con el id de usuario y guardarlo en PouchDB:<\/p>\n<pre>function migrateGuestToUser(userId) {\r\n  var list = {\r\n    _id: '123',\r\n    type: 'list',\r\n    title: 'TodoMVC list',\r\n    owner: 'p:' + userId\r\n  };\r\n  db.put(list, function(err, result) {\r\n    if (!err) {\r\n      console.log('Successfully saved user list');\r\n    }\r\n  })\r\n}\r\n<\/pre>\n<p><strong>Nota:<\/strong> Es muy importante establecer el campo propietario, la funci\u00f3n de sincronizaci\u00f3n rechazar\u00e1 el documento <a href=\"https:\/\/github.com\/jamiltz\/getting-started-todo\/blob\/master\/sync-gateway-config.json#L28\">de lo contrario<\/a>.<\/p>\n<p>Y podemos llamarlo en <strong>startSessionAndSync<\/strong>:<\/p>\n<pre>function startSessionAndSync(accessToken, userId) {\r\n  migrateGuestToUser(userId);\r\n}\r\n<\/pre>\n<p>Los documentos de tarea pertenecen a una lista y, por tanto, tienen un <strong>lista_id<\/strong> que necesitamos establecer. Cambie la propiedad <strong>addTodo<\/strong> funci\u00f3n en <strong>app.js<\/strong> para que se vea como abajo. F\u00edjese en que hemos definido el par\u00e1metro <strong>lista_id<\/strong> al campo <strong>_id<\/strong> de la lista que hemos insertado anteriormente:<\/p>\n<pre>function addTodo(text) {\r\n  var todo = {\r\n    _id: new Date().toISOString(),\r\n    title: text,\r\n    checked: false,\r\n    type: 'task',\r\n    list_id: '123',\r\n    created_at: new Date()\r\n  };\r\n  db.put(todo, function callback(err, result) {\r\n    if (!err) {\r\n      console.log('Successfully posted a todo!');\r\n    }\r\n  });\r\n}\r\n<\/pre>\n<p>Ahora que tenemos los documentos apropiados que se ajustan al modelo de datos de ToDoLite, podemos echar un vistazo a la autenticaci\u00f3n y la replicaci\u00f3n.<\/p>\n<h1>Activaci\u00f3n de CORS en Sync Gateway<\/h1>\n<p>En este tutorial, vamos a ejecutar una instancia local de Sync Gateway en <strong>localhost:4984<\/strong> pero estamos sirviendo nuestra aplicaci\u00f3n web en <strong>localhost:9000<\/strong>. En este punto obtendr\u00edamos un error de pol\u00edtica de mismo origen. Pero <a href=\"https:\/\/twitter.com\/jchris\">Chris<\/a> recientemente a\u00f1adi\u00f3 soporte CORS a Sync Gateway para este prop\u00f3sito. As\u00ed que no tenemos que escribir una sola l\u00ednea de c\u00f3digo del lado del servidor :)<\/p>\n<p>CORS permite a las aplicaciones web acceder a recursos de dominios distintos del dominio de origen. Al activar CORS en Sync Gateway le estamos diciendo al navegador \"S\u00ed, el nombre de dominio Sync Gateway puede comunicarse con esta aplicaci\u00f3n web\". Abrir <strong>sync-gateway-config.json<\/strong> con la configuraci\u00f3n CORS adicional para habilitarlo en <strong>localhost:9000<\/strong>:<\/p>\n<pre>{ \r\n ...\r\n \"CORS\": {\r\n   \"Origin\": [\"https:\/\/localhost:9000\"],\r\n   \"LoginOrigin\": [\"https:\/\/localhost:9000\"],\r\n   \"Headers\": [\"Content-Type\"],\r\n   \"MaxAge\": 17280000\r\n },\r\n ...\r\n}\r\n<\/pre>\n<p>Utilice Sync Gateway 1.1 o posterior. In\u00edcielo con el archivo de configuraci\u00f3n:<\/p>\n<pre>$ ~\/Downloads\/sync_gateway sync-gateway-config.json\r\n<\/pre>\n<p>Volver a <strong>app.js<\/strong>actualice la url de remoteCouch en consecuencia:<\/p>\n<pre>var SYNC_GATEWAY_URL = 'https:\/\/127.0.0.1:4984\/todos\/';\r\nvar remoteCouch = SYNC_GATEWAY_URL;\r\n<\/pre>\n<p>Ahora bien, si intent\u00e1ramos sincronizar la lista con Sync Gateway obtendr\u00edamos un error 401 No autorizado. Vamos a solucionarlo creando una sesi\u00f3n de usuario con el login de Facebook.<\/p>\n<h1>Autenticaci\u00f3n con Sync Gateway<\/h1>\n<p>Para autenticarnos con Sync Gateway podemos enviar una solicitud POST a <strong>\/todos\/_facebook<\/strong> con el token de acceso, si recibimos un 200 OK, el navegador establecer\u00e1 la cookie de sesi\u00f3n devuelta por Sync Gateway para futuras r\u00e9plicas push\/pull.<\/p>\n<pre>function startSyncGatewaySession(accessToken) {\r\n  var request = new XMLHttpRequest();\r\n  request.open('POST', SYNC_GATEWAY_URL + '\/_facebook', true);\r\n  request.setRequestHeader('Content-Type', 'application\/json');\r\n  request.onreadystatechange = function() {\r\n    if (request.readyState == 4 &amp;&amp; request.status == 200) {\r\n      console.log('New SG session, starting sync!');\r\n      sync();\r\n  };\r\n  request.withCredentials = true;\r\n  request.send(JSON.stringify({\"access_token\": accessToken}));\r\n}\r\n<\/pre>\n<p><strong>Nota<\/strong>: Es importante fijar <strong>request.withCredentials = true<\/strong> en una solicitud CORS para guardar la cookie devuelta por Sync Gateway para futuras solicitudes autenticadas (r\u00e9plicas push\/pull).<\/p>\n<p>Ll\u00e1malo <strong>startSessionAndSync<\/strong> pasando el <strong>accessToken<\/strong> volvimos de Facebook:<\/p>\n<pre>function startSessionAndSync(accessToken, userId) {\r\n  migrateGuestToUser(userId);\r\n  startSyncGatewaySession(accessToken);\r\n}\r\n<\/pre>\n<h1>Conclusi\u00f3n<\/h1>\n<p>Ahora abre tu navegador, puedes comprobar que los elementos de todo se sincronizan con otra ventana del navegador abierta o con las aplicaciones nativas que ejecutan TodoLite.<\/p>\n<p>Los usuarios pueden seguir creando tareas sin estar conectados. Pero en cuanto un usuario inicia sesi\u00f3n, las tareas pasan a formar parte de su lista. Ofrecer una funci\u00f3n de cuenta de invitado es una de las muchas ventajas de crear capacidades offline-first.<\/p>\n<p>F\u00edjese en el <strong>Lista TodoMVC<\/strong> se muestra como una tarea en Chrome. Esto se debe a que en este ejemplo se utilizaba la funci\u00f3n <strong>allDocs<\/strong> para visualizar las tareas.<\/p>\n<p>En el pr\u00f3ximo post, usaremos consultas Map\/Reduce para a\u00f1adir la capacidad multi-lista y tambi\u00e9n un documento de perfil para compartirlos con otros usuarios.<\/p>\n<p>M\u00e1s informaci\u00f3n:<\/p>\n<ul>\n<li>Configuraci\u00f3n CORS de Sync Gateway:\u00a0\u00a0<a style=\"font-family: sans-serif, Arial, Verdana, 'Trebuchet MS';line-height: 20.8000011444092px;text-align: left\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/mobile\/#cors-configuration\">https:\/\/www.couchbase.com\/developers\/mobile\/#cors-configuration<\/a><\/li>\n<li>Activaci\u00f3n de cookies en una solicitud CORS: <a href=\"https:\/\/www.html5rocks.com\/en\/tutorials\/cors\/#toc-withcredentials\">https:\/\/www.html5rocks.com\/en\/tutorials\/cors\/#toc-withcredentials<\/a><\/li>\n<li>R\u00e9plicas filtradas con PouchDB: <a href=\"https:\/\/pouchdb.com\/2015\/04\/05\/filtered-replication.html\">https:\/\/pouchdb.com\/2015\/04\/05\/filtered-replication.html<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>This week, PouchDB v3.4.0\u00a0was released with Couchbase Sync Gateway compatibility. In this post, we\u2019ll take the existing \ufffcTodoMVC example\ufffc and add filtered sync using Facebook authentication. In addition to syncing between Web clients, we\u2019ll change the data model slightly to [&hellip;]<\/p>","protected":false},"author":51,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[],"ppma_author":[9028],"class_list":["post-1917","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>First steps with PouchDB &amp; Sync Gateway - The Couchbase Blog<\/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\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"First steps with PouchDB &amp; Sync Gateway\" \/>\n<meta property=\"og:description\" content=\"This week, PouchDB v3.4.0\u00a0was released with Couchbase Sync Gateway compatibility. In this post, we\u2019ll take the existing \ufffcTodoMVC example\ufffc and add filtered sync using Facebook authentication. In addition to syncing between Web clients, we\u2019ll change the data model slightly to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-16T01:03:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-06T07:03:18+00:00\" \/>\n<meta name=\"author\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/\"},\"author\":{\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6\"},\"headline\":\"First steps with PouchDB &amp; Sync Gateway\",\"datePublished\":\"2015-12-16T01:03:03+00:00\",\"dateModified\":\"2023-10-06T07:03:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/\"},\"wordCount\":745,\"commentCount\":9,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/\",\"name\":\"First steps with PouchDB &amp; Sync Gateway - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-16T01:03:03+00:00\",\"dateModified\":\"2023-10-06T07:03:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#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\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"First steps with PouchDB &amp; Sync Gateway\"}]},{\"@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6\",\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"caption\":\"James Nocentini, Technical Writer, Mobile, Couchbase\"},\"description\":\"James Nocentini is the Technical Writer in charge of the documentation for Couchbase Mobile. Previously, he worked as a Developer Advocate and before that as a front-end developer for HouseTrip. He also enjoys writing Android tutorials for raywenderlich.com in his spare time.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"First steps with PouchDB &amp; Sync Gateway - The Couchbase Blog","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\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/","og_locale":"es_MX","og_type":"article","og_title":"First steps with PouchDB &amp; Sync Gateway","og_description":"This week, PouchDB v3.4.0\u00a0was released with Couchbase Sync Gateway compatibility. In this post, we\u2019ll take the existing \ufffcTodoMVC example\ufffc and add filtered sync using Facebook authentication. In addition to syncing between Web clients, we\u2019ll change the data model slightly to [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-16T01:03:03+00:00","article_modified_time":"2023-10-06T07:03:18+00:00","author":"James Nocentini, Technical Writer, Mobile, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"James Nocentini, Technical Writer, Mobile, Couchbase","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/"},"author":{"name":"James Nocentini, Technical Writer, Mobile, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6"},"headline":"First steps with PouchDB &amp; Sync Gateway","datePublished":"2015-12-16T01:03:03+00:00","dateModified":"2023-10-06T07:03:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/"},"wordCount":745,"commentCount":9,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Mobile"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb-sync-gateway-todomvc-todolite\/","url":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/","name":"First steps with PouchDB &amp; Sync Gateway - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-16T01:03:03+00:00","dateModified":"2023-10-06T07:03:18+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#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\/first-steps-with-pouchdb--sync-gateway-todomvc-todolite\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"First steps with PouchDB &amp; Sync Gateway"}]},{"@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6","name":"James Nocentini, Redactor t\u00e9cnico, M\u00f3vil, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816","url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","caption":"James Nocentini, Technical Writer, Mobile, Couchbase"},"description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/"}]}},"authors":[{"term_id":9028,"user_id":51,"is_guest":0,"slug":"james-nocentini","display_name":"James Nocentini, Technical Writer, Mobile, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","author_category":"","last_name":"Nocentini","first_name":"James","job_title":"","user_url":"","description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1917","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\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1917"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1917\/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=1917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1917"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}