{"id":2494,"date":"2017-01-19T21:43:59","date_gmt":"2017-01-19T21:43:58","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2494"},"modified":"2025-10-09T07:23:21","modified_gmt":"2025-10-09T14:23:21","slug":"node-js-swagger-monitor-document-changes-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/","title":{"rendered":"Usando Node.js e Swagger para monitorar altera\u00e7\u00f5es de documentos no Couchbase Mobile"},"content":{"rendered":"<div style=\"overflow: auto\">\n<div style=\"float: left;width: 50%\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-392\" src=\"\/wp-content\/original-assets\/january-2017\/using-node.js-and-swagger-to-monitor-document-changes-in-couchbase-mobile\/node.js_logo.svg_.png\" alt=\"Node.js logo\" width=\"360\" height=\"220\" \/><\/div>\n<div style=\"float: left;width: 50%\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-408 alignnone\" src=\"\/wp-content\/original-assets\/january-2017\/using-node.js-and-swagger-to-monitor-document-changes-in-couchbase-mobile\/swagger-logo.png\" alt=\"Swagger Logo\" width=\"360\" height=\"360\" \/><\/div>\n<\/div>\n<p>Ao criar aplicativos com <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase Mobile<\/a> h\u00e1 muitas possibilidades interessantes de integra\u00e7\u00e3o no lado do servidor.<br \/>\nA cria\u00e7\u00e3o de l\u00f3gica comercial para resolver conflitos de sincroniza\u00e7\u00e3o \u00e9 um uso comum. O <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">Gateway de sincroniza\u00e7\u00e3o<\/a> O feed \"changes\" do documento tamb\u00e9m facilita a implementa\u00e7\u00e3o de todos os tipos de opera\u00e7\u00f5es orientadas por eventos. Explorarei isso nas pr\u00f3ximas postagens.<\/p>\n<p>Um aplicativo pode usar ambos <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">Gateway de sincroniza\u00e7\u00e3o<\/a> e <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase Lite<\/a> chamando diretamente a API ReST para cada um deles. No entanto, isso requer a escrita de um monte de c\u00f3digo padr\u00e3o que n\u00e3o \u00e9 muito divertido. O PouchDB oferece uma op\u00e7\u00e3o JavaScript compat\u00edvel, mas agora h\u00e1 uma alternativa mais leve.<\/p>\n<p>H\u00e1 pouco tempo, o Couchbase passou a usar o Swagger para documentar o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase Mobile<\/a> APIs. O Swagger faz muito mais do que criar<br \/>\ndocumenta\u00e7\u00e3o, no entanto. Com uma \u00fanica especifica\u00e7\u00e3o Swagger, voc\u00ea pode gerar documenta\u00e7\u00e3o, c\u00f3digo stub de servidor, casos de teste, um site sandbox e muito mais. O melhor de tudo para mim \u00e9 que o Swagger pode gerar SDKs de clientes... em 40 idiomas diferentes!<\/p>\n<p>Neste post, mostrarei como usar o cliente Swagger Node.js. Criaremos um aplicativo super simples que monitora as altera\u00e7\u00f5es em documentos no Couchbase. Isso se tornar\u00e1 a base para a cria\u00e7\u00e3o de outras coisas legais que est\u00e3o por vir. Vamos nos aprofundar.<\/p>\n<h2 id=\"what-we-ll-need\">O que precisamos<\/h2>\n<p>Para acompanhar o processo, voc\u00ea precisar\u00e1 de<\/p>\n<ul>\n<li>Node.js (estou usando a vers\u00e3o 6.9.1 em um Mac)<\/li>\n<li>Swagger JS (O cliente Swagger Node.js)<\/li>\n<li>Gateway de sincroniza\u00e7\u00e3o do Couchbase<\/li>\n<li>A especifica\u00e7\u00e3o Swagger do Sync Gateway<\/li>\n<\/ul>\n<p>Presumo que voc\u00ea j\u00e1 tenha o Node.js instalado.<\/p>\n<h2 id=\"install-the-swagger-js-library\">Instalar a biblioteca Swagger JS<\/h2>\n<p>Em um shell de linha de comando, mude para o diret\u00f3rio onde voc\u00ea manter\u00e1 seu projeto.<\/p>\n<p>Para obter o cliente e as depend\u00eancias do Swagger, execute<\/p>\n<pre><code class=\"language-bash\">$ npm install swagger-client<\/code><\/pre>\n<p>(Voc\u00ea ver\u00e1 alguns avisos, que podem ser ignorados).<\/p>\n<h2 id=\"install-sync-gateway\">Instalar o Sync Gateway<\/h2>\n<p>Fa\u00e7a o download do pacote Sync Gateway para sua plataforma <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/nosql-databases\/downloads\/#cb-mobile\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a>. (Se voc\u00ea estiver executando o Linux e n\u00e3o encontrar um pacote para sua distribui\u00e7\u00e3o, consulte as instru\u00e7\u00f5es em<br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/installing-sync-gateway-alternate-linux-distributions\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">esta postagem do blog<\/a> para obter ajuda).<\/p>\n<p>Para executar o Sync Gateway, precisamos criar um arquivo de configura\u00e7\u00e3o. Aqui est\u00e1 uma configura\u00e7\u00e3o simples que podemos usar. Copie o texto aqui e cole-o em um arquivo chamado \"sync-gateway-config.json\", ou algo semelhante.<\/p>\n<pre><code class=\"language-json\">{\r\n  \"log\": [\"HTTP+\"],\r\n  \"adminInterface\": \"127.0.0.1:4985\",\r\n  \"interface\": \"127.0.0.1:4984\",\r\n  \"CORS\": {\r\n    \"origin\":[\"*\"],\r\n    \"loginorigin\":[\"*\"],\r\n    \"headers\":[\"Content-Type\"],\r\n    \"maxAge\": 1728000\r\n  },\r\n  \"databases\": {\r\n    \"test\": {\r\n      \"server\": \"walrus:\",\r\n      \"users\": { \"GUEST\": {\"disabled\": false, \"admin_channels\": [\"*\"] } }\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>Essa configura\u00e7\u00e3o usa um banco de dados interno criado para testar o Sync Gateway. O servidor tamb\u00e9m s\u00f3 responder\u00e1 a conex\u00f5es no localhost. Voc\u00ea pode encontrar recursos para saber mais sobre a configura\u00e7\u00e3o do Sync Gateway no final desta postagem.<\/p>\n<p>Inicie o Sync Gateway executando<\/p>\n<pre><code class=\"language-bash\">$ \/path\/to\/sync_gateway sync-gateway-config.json<\/code><\/pre>\n<p>Voc\u00ea ver\u00e1 alguns resultados de registro. Pode ser interessante observar os logs ao executar o aplicativo mais tarde.<\/p>\n<h2 id=\"make-a-copy-of-the-sync-gateway-swagger-spec\">Fa\u00e7a uma c\u00f3pia da especifica\u00e7\u00e3o Swagger do Sync Gateway<\/h2>\n<p>Voc\u00ea pode encontrar a especifica\u00e7\u00e3o Swagger para a APi p\u00fablica do Sync Gateway ReST (em compara\u00e7\u00e3o com a API de administra\u00e7\u00e3o) em <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/current\/_attachments\/sync-gateway-admin.yaml\">https:\/\/docs.couchbase.com\/sync-gateway\/current\/_attachments\/sync-gateway-admin.yaml<\/a>.<\/p>\n<p>As especifica\u00e7\u00f5es do Swagger s\u00e3o armazenadas como JSON. Embora o Swagger possa fazer o download do texto diretamente, \u00e9 melhor fazer uma c\u00f3pia. Dessa forma, se a especifica\u00e7\u00e3o for alterada, isso n\u00e3o prejudicar\u00e1 seu aplicativo.<\/p>\n<p>Copie as informa\u00e7\u00f5es em um arquivo no diret\u00f3rio do seu projeto chamado sync-gateway-spec.json, ou algo semelhante. O arquivo precisa de uma extens\u00e3o .json para que o Node o processe.<\/p>\n<h2 id=\"create-the-node-js-app\">Criar o aplicativo Node.js<\/h2>\n<p>Vamos montar o aplicativo. Abra um novo arquivo no diret\u00f3rio do seu projeto que termine com uma extens\u00e3o .js. Usei um arquivo chamado app.js.<\/p>\n<pre><code class=\"language-JavaScript\">const Swagger = require('swagger-client');\r\nconst spec = require('.\/sync-gateway-spec.json');<\/code><\/pre>\n<p>A primeira linha importa o cliente Swagger e o torna dispon\u00edvel. A segunda linha \u00e9 um pouco mais incomum. Ela inicializa o <code>especifica\u00e7\u00e3o<\/code> do objeto JSON no arquivo. \u00c9 por isso que a extens\u00e3o .json \u00e9 importante. \u00c9 assim que o Node reconhece que estamos<br \/>\nimportando JSON, n\u00e3o um pacote normal.<\/p>\n<p>O arquivo de especifica\u00e7\u00f5es tem um host conectado, mas vamos configur\u00e1-lo n\u00f3s mesmos.<\/p>\n<pre><code class=\"language-JavaScript\">const SYNC_GATEWAY_HOST = 'localhost:4984';\r\n\r\nspec.host = SYNC_GATEWAY_HOST;\r\n<\/code><\/pre>\n<p>Em seguida, prepararemos os par\u00e2metros para nossa chamada ao <code>_mudan\u00e7as<\/code> ponto final.<\/p>\n<pre><code class=\"language-JavaScript\">let query = {\r\n  db: 'test',\r\n  filter: 'sync_gateway\/bychannel',\r\n  channels: 'notification',\r\n  active_only: true,\r\n  include_docs: true,\r\n  feed: 'longpoll',\r\n  timeout: 0\r\n};<\/code><\/pre>\n<p>Observe que temos aqui uma combina\u00e7\u00e3o do nome do banco de dados (teste), que acaba fazendo parte do URL do endpoint, e algumas op\u00e7\u00f5es que queremos definir.<\/p>\n<p>Agora que j\u00e1 inicializamos o que precisamos, podemos criar a inst\u00e2ncia do cliente Swagger.<\/p>\n<pre><code class=\"language-JavaScript\">let client = new Swagger({\r\n  spec: spec,\r\n  success: function() {\r\n    monitor(client);\r\n  },\r\n  function(error) {\r\n    console.log('client error: ', error.statusText);\r\n    process.exit(1);\r\n  }\r\n});<\/code><\/pre>\n<p>H\u00e1 v\u00e1rios aspectos importantes a serem observados aqui.<\/p>\n<p>Estamos usando o cliente de forma s\u00edncrona. Se quiser, voc\u00ea pode usar o JavaScript Promises especificando <code>usePromise: true<\/code>. Eu n\u00e3o queria fazer isso porque n\u00e3o estou fazendo nenhum processamento real e isso complica um pouco o c\u00f3digo.<\/p>\n<p>Em vez de <code>especifica\u00e7\u00f5es: especifica\u00e7\u00f5es<\/code>Poder\u00edamos ter listado uma url para a especifica\u00e7\u00e3o do Swagger usando <code>url:<\/code>. Novamente, voc\u00ea deve evitar isso, pelo menos na produ\u00e7\u00e3o, porque a especifica\u00e7\u00e3o pode mudar remotamente e quebrar seu c\u00f3digo.<\/p>\n<p>O <code>sucesso:<\/code> especifica duas fun\u00e7\u00f5es. Ambas s\u00e3o retornos de chamada. A primeira \u00e9 chamada se a constru\u00e7\u00e3o for bem-sucedida e a segunda se falhar. Elas s\u00e3o \"globais\", de certa forma. Essas fun\u00e7\u00f5es funcionam como padr\u00e3o se n\u00e3o especificarmos fun\u00e7\u00f5es diferentes para a entrada<br \/>\nchamadas individuais. Isso \u00e9 muito \u00fatil no caso de erros.<\/p>\n<p>Atribu\u00edmos a inst\u00e2ncia a uma vari\u00e1vel <code>cliente<\/code>. A inst\u00e2ncia do cliente \u00e9 preenchida de forma ass\u00edncrona. Ela n\u00e3o est\u00e1 pronta para ser usada at\u00e9 que ocorra a chamada de retorno de sucesso. Portanto, temos a interessante constru\u00e7\u00e3o de que <code>cliente<\/code> \u00e9 usado internamente no<br \/>\ncallback. Na vers\u00e3o Promises, o cliente seria passado como argumento no <code>.ent\u00e3o<\/code> cl\u00e1usula.<\/p>\n<p>Na pr\u00f3xima parte do c\u00f3digo, usamos o cliente para ouvir o <code>_mudan\u00e7as<\/code> ponto final.<\/p>\n<pre><code class=\"language-JavaScript\">function monitor(client) {\r\n  client.database.get_db_changes(query, message);\r\n}<\/code><\/pre>\n<p>Isso apresenta um problema: como descobrimos o nome da fun\u00e7\u00e3o que queremos chamar? N\u00e3o h\u00e1 um mapeamento fixo entre endpoints e nomes de fun\u00e7\u00f5es. Esse \u00e9 outro recurso \u00fatil do Swagger. A classe cliente \u00e9 autodocumentada. Voc\u00ea chama <code>ajuda()<\/code> em qualquer n\u00edvel que voc\u00ea precisar. Por exemplo, para saber mais sobre endpoints no banco de dados, adicione o seguinte em seu c\u00f3digo:<\/p>\n<pre><code class=\"language-JavaScript\">client.database.help();<\/code><\/pre>\n<p>A sa\u00edda de ajuda \u00e9 exibida na sa\u00edda da linha de comando (ou no console do seu IDE). Ela descrever\u00e1 os pontos de extremidade e todos os par\u00e2metros poss\u00edveis.<\/p>\n<p>Voltando \u00e0 chamada do cliente, vemos que passamos o nome do banco de dados (obrigat\u00f3rio) e v\u00e1rios par\u00e2metros agrupados no par\u00e2metro <code>consulta<\/code> objeto. Isso foi um pouco confuso. Voc\u00ea pode esperar que eles sejam separados, mas isso n\u00e3o acontece.<br \/>\ntrabalho. Nenhum dos exemplos que encontrei explicava isso.<\/p>\n<p>Fornecemos uma fun\u00e7\u00e3o de retorno de chamada <code>mensagem<\/code>. (Observe que isso \u00e9 usado se a chamada ReST for bem-sucedida. Contamos com o padr\u00e3o para lidar com falhas).<\/p>\n<pre><code class=\"language-JavaScript\">function message(response) {\r\n  console.log(response.data);\r\n  query.since = response.obj.last_seq;\r\n  monitor(client);\r\n}<\/code><\/pre>\n<p>O retorno de chamada recebe um objeto que cont\u00e9m todos os detalhes da resposta. Escrevi esse aplicativo apenas para mostrar a estrutura de loop necess\u00e1ria para ouvir o feed de altera\u00e7\u00f5es do Sync Gateway. Por isso, o <code>mensagem<\/code> n\u00e3o faz muita coisa. Escrevemos a chamada<br \/>\npara fins de depura\u00e7\u00e3o. Em seguida, queremos voltar e ouvir a pr\u00f3xima atualiza\u00e7\u00e3o. O Sync Gateway sabe o que enviar com base nas IDs de sequ\u00eancia. Para controlar isso, usamos a fun\u00e7\u00e3o <code>\u00faltima_seq<\/code> informa\u00e7\u00f5es de nossa \u00faltima resposta.<\/p>\n<p>\u00c9 isso a\u00ed. Aqui est\u00e1 o c\u00f3digo completo do aplicativo.<\/p>\n<pre><code class=\"language-JavaScript\">const Swagger = require('swagger-client');\r\nconst spec = require('.\/sync-gateway-spec.json');\r\n\r\nconst SYNC_GATEWAY_HOST = 'localhost:4984';\r\n\r\nspec.host = SYNC_GATEWAY_HOST;\r\n\r\nlet query = {\r\n  db: 'test',\r\n  filter: 'sync_gateway\/bychannel',\r\n  channels: 'notification',\r\n  active_only: true,\r\n  include_docs: true,\r\n  feed: 'longpoll',\r\n  timeout: 0\r\n};\r\n\r\nlet client = new Swagger({\r\n  spec: spec,\r\n  success: function() {\r\n    monitor(client);\r\n  },\r\n  function(error) {\r\n    console.log('client error: ', error.statusText);\r\n    process.exit(1);\r\n  }\r\n});\r\n\r\nfunction monitor(client) {\r\n  client.database.get_db_changes(query, message);\r\n}\r\n\r\nfunction message(response) {\r\n  console.log(response.data);\r\n  query.since = response.obj.last_seq;\r\n  monitor(client);\r\n}<\/code><\/pre>\n<h2 id=\"final-notes\">Notas finais<\/h2>\n<p>Voc\u00ea pode iniciar seu aplicativo e experiment\u00e1-lo. Certifique-se de que o Sync Gateway esteja em execu\u00e7\u00e3o. Em seguida, execute<\/p>\n<pre><code class=\"language-bash\">$ node app.js<\/code><\/pre>\n<p>Voc\u00ea dever\u00e1 ver uma resposta nos logs do Sync Gateway e algo parecido com esta sa\u00edda do pr\u00f3prio aplicativo:<\/p>\n<pre><code class=\"language-JSON\">{\"results\":[\r\n{\"seq\":1,\"id\":\"_user\/GUEST\",\"changes\":[]}\r\n],\r\n\"last_seq\":\"1\"}<\/code><\/pre>\n<p>Agora, adicione um novo documento. Voc\u00ea pode fazer isso com o cURL na linha de comando. Aqui est\u00e1 um exemplo.<\/p>\n<pre><code class=\"language-bash\">$ curl -X PUT -H \"Content-Type: application\/json\" -d '{ \"key\": \"value\", \"channels\": \"notification\" }' https:\/\/localhost:4984\/test\/doc<\/code><\/pre>\n<p>Seu aplicativo Node deve produzir algo parecido com isto:<\/p>\n<pre><code class=\"language-JSON\">{\"results\":[\r\n{\"seq\":2,\"id\":\"doc\",\"doc\":{\"_id\":\"doc\",\"_rev\":\"1-d0efa985de274451fc7cdcf471152ce2\",\"channels\":\"notification\",\"key\":\"value\"},\"changes\":[{\"rev\":\"1-d0efa985de274451fc7cdcf471152ce2\"}]}\r\n],\r\n\"last_seq\":\"2\"}<\/code><\/pre>\n<h3 id=\"other-resources\">Outros recursos<\/h3>\n<p>Leia mais sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/mobile\/\">Couchbase Mobile<\/a>.<\/p>\n<p>Leia sobre o <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">Gateway de sincroniza\u00e7\u00e3o<\/a> <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/references\/sync-gateway\/rest-api\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">APIs ReST<\/a>.<\/p>\n<p>O <a href=\"https:\/\/github.com\/swagger-api\/swagger-js\" target=\"_blank\" rel=\"noopener noreferrer\">Reposit\u00f3rio GitHub do cliente Swagger JS<\/a> tem uma documenta\u00e7\u00e3o \u00fatil inclu\u00edda.<\/p>\n<p>Saiba mais sobre o Swagger em <a href=\"https:\/\/swagger.io\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/swagger.io<\/a>.<\/p>\n<p>O editor Swagger on-line \u00e9 muito \u00fatil. Voc\u00ea pode gerar SDKs de cliente aqui ou at\u00e9 mesmo experimentar a API diretamente. Basta colar a especifica\u00e7\u00e3o do Swagger no editor. <a href=\"https:\/\/editor.swagger.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/editor.swagger.io\/<\/a><\/p>\n<p>H\u00e1 um projeto da comunidade React Native Couchbase que usa o cliente JavaScript. Voc\u00ea pode encontrar alguns exemplos interessantes em <a href=\"https:\/\/github.com\/couchbaselabs\/react-native-couchbase-lite\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/couchbaselabs\/react-native-couchbase-lite<\/a><\/p>\n<h2 id=\"postscript\">P\u00f3s-escrito<\/h2>\n<p>Confira mais recursos em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/community\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">portal do desenvolvedor<\/a> e nos siga no Twitter <a href=\"https:\/\/twitter.com\/CouchbaseDev\" target=\"_blank\" rel=\"noopener noreferrer\">@CouchbaseDev<\/a>.<\/p>\n<p>Voc\u00ea pode postar perguntas em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\" target=\"_blank\" rel=\"noopener noreferrer\">f\u00f3runs<\/a>. E participamos ativamente de <a href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" target=\"_blank\" rel=\"noopener noreferrer\">Estouro de pilha<\/a>.<\/p>\n<p>Voc\u00ea pode me seguir pessoalmente em <a href=\"https:\/\/twitter.com\/HodGreeley\" target=\"_blank\" rel=\"noopener noreferrer\">@HodGreeley<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>When building applications with Couchbase Mobile there are a lot of interesting possibilities for server-side integration. Creating business logic to resolve synchronization conflicts is one common use. The Sync Gateway document \u201cchanges\u201d feed makes all sorts of event-driven operations easy [&hellip;]<\/p>","protected":false},"author":73,"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,1822],"tags":[1790],"ppma_author":[9042],"class_list":["post-2494","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","category-node-js","tag-swagger"],"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>Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This article shows how to use the Swagger Node.js client. Learn how to build a super simple app that monitors changes in documents in Couchbase.\" \/>\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\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"This article shows how to use the Swagger Node.js client. Learn how to build a super simple app that monitors changes in documents in Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-19T21:43:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:23:21+00:00\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile\",\"datePublished\":\"2017-01-19T21:43:58+00:00\",\"dateModified\":\"2025-10-09T14:23:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\"},\"wordCount\":1313,\"commentCount\":11,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Swagger\"],\"articleSection\":[\"Couchbase Mobile\",\"Node.js\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\",\"name\":\"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-19T21:43:58+00:00\",\"dateModified\":\"2025-10-09T14:23:21+00:00\",\"description\":\"This article shows how to use the Swagger Node.js client. Learn how to build a super simple app that monitors changes in documents in Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#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\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile\"}]},{\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile - The Couchbase Blog","description":"Este artigo mostra como usar o cliente Swagger Node.js. Saiba como criar um aplicativo super simples que monitora altera\u00e7\u00f5es em documentos no 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\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/","og_locale":"pt_BR","og_type":"article","og_title":"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile","og_description":"This article shows how to use the Swagger Node.js client. Learn how to build a super simple app that monitors changes in documents in Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-01-19T21:43:58+00:00","article_modified_time":"2025-10-09T14:23:21+00:00","author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile","datePublished":"2017-01-19T21:43:58+00:00","dateModified":"2025-10-09T14:23:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/"},"wordCount":1313,"commentCount":11,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Swagger"],"articleSection":["Couchbase Mobile","Node.js"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/","name":"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-19T21:43:58+00:00","dateModified":"2025-10-09T14:23:21+00:00","description":"Este artigo mostra como usar o cliente Swagger Node.js. Saiba como criar um aplicativo super simples que monitora altera\u00e7\u00f5es em documentos no Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#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\/node-js-swagger-monitor-document-changes-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Node.js and Swagger to Monitor Document Changes in Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Advogado do desenvolvedor, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2494"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2494\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2494"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}