{"id":1544,"date":"2014-12-17T15:43:15","date_gmt":"2014-12-17T15:43:14","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1544"},"modified":"2025-06-13T23:50:08","modified_gmt":"2025-06-14T06:50:08","slug":"couchbase-connect-2014-keynote-demo-application-how-we-did-it","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/","title":{"rendered":"Aplicativo de demonstra\u00e7\u00e3o do Couchbase Connect 2014 Keynote - Como fizemos isso"},"content":{"rendered":"<h3>Node.js + Couchbase 3.0 + SDK 2.0 + Bootstrap<\/h3>\n<h2>Requisitos<\/h2>\n<p>Quando chegou a hora de criar uma demonstra\u00e7\u00e3o do produto para a Confer\u00eancia Couchbase Connect, foram estabelecidos os seguintes requisitos:<\/p>\n<p>[1] Deve ser uma demonstra\u00e7\u00e3o ao vivo, com a participa\u00e7\u00e3o do p\u00fablico - nada de filmes prontos ou apresenta\u00e7\u00f5es apenas em PowerPoint.  O n\u00edvel foi elevado, com riscos significativos.<br \/>\n[2] Ele deve demonstrar o poder do Couchbase 3.0 e mostrar a consist\u00eancia em tempo real dos dados entre clusters em diferentes centros de dados (XDCR).<br \/>\n[3] Ele deve ser \u00e1gil, aproveitando o poder dos novos SDKs do Couchbase 2.0.<br \/>\n[4] O aplicativo precisa ter o c\u00f3digo conclu\u00eddo em 4 dias para refor\u00e7ar como o desenvolvimento com o Couchbase \u00e9 ideal para a empresa \u00e1gil.<br \/>\n[5] Diga ao mundo como foi feito e prove-o publicando o c\u00f3digo-fonte.<\/p>\n<p>Decidiu-se que um aplicativo de leil\u00e3o, distribu\u00eddo em dois servidores da Web em dois centros de dados diferentes que conversam com dois clusters diferentes, atingiria o objetivo.   Um cluster de Salt Lake City e um cluster de Londres manter\u00e3o a consist\u00eancia com replica\u00e7\u00e3o bidirecional entre eles usando o XDCR.   O novo protocolo DCP no Couchbase 3.0 significa que a consist\u00eancia seria limitada apenas pela velocidade dos fios.   Um servidor de aplicativos em cada data center executando o node.js lida com o tr\u00e1fego em cada regi\u00e3o.  O c\u00f3digo pode ser baixado de <a href=\"https:\/\/github.com\/couchbaselabs\/keynotedemo14\">reposit\u00f3rio do couchbaselabs no github. <\/a>**<\/p>\n<h2><span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">Design de aplicativos<\/span><\/h2>\n<p>Al\u00e9m de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/build-a-rest-api-with-node-js-express-and-couchbase\/\">usando node.js<\/a> Com o Express e o Couchbase 2.0 SDK, o bootstrap foi usado para o desenvolvimento de front-end.   Os SDKs 2.0 s\u00e3o uma conquista not\u00e1vel e incluem novos avan\u00e7os significativos que simplificam o desenvolvimento.   Informa\u00e7\u00f5es sobre os SDKs 2.0 e por que o Couchbase continua a ampliar a lideran\u00e7a de desenvolvimento no mercado podem ser encontradas em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/\">portal do desenvolvedor.<\/a><\/p>\n<h3>Gerenciamento de sess\u00f5es<\/h3>\n<p>Embora nenhuma autentica\u00e7\u00e3o seja necess\u00e1ria para um leil\u00e3o apenas por divers\u00e3o, ainda \u00e9 necess\u00e1rio um meio de identificar usu\u00e1rios e sess\u00f5es simult\u00e2neas.  Um formul\u00e1rio de login simples armazena um cookie com um ID de usu\u00e1rio para cada sess\u00e3o.   A fun\u00e7\u00e3o de login verifica se o usu\u00e1rio existe e se h\u00e1 alguma viola\u00e7\u00e3o de palavras filtradas antes de criar um cookie de sess\u00e3o.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">m\u00f3dulo.<span style=\"color: #660066\">exporta\u00e7\u00f5es<\/span>.<span style=\"color: #660066\">login<\/span> <span style=\"color: #339933\">=<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>novoUsu\u00e1rio<span style=\"color: #339933\">,<\/span>req<span style=\"color: #339933\">,<\/span>res<span style=\"color: #339933\">,<\/span>feito<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nfilterScan<span style=\"color: #009900\">(<\/span>novoUsu\u00e1rio<span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>filtcb<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>filtcb<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ndb.<span style=\"color: #660066\">ler<\/span><span style=\"color: #009900\">(<\/span>novoUsu\u00e1rio<span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #339933\">,<\/span> usu\u00e1rio<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>erro <span style=\"color: #339933\">&amp;&amp;<\/span> err.<span style=\"color: #660066\">c\u00f3digo<\/span> <span style=\"color: #339933\">===<\/span> couchbase.<span style=\"color: #660066\">erros<\/span>.<span style=\"color: #660066\">keyNotFound<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nres.<span style=\"color: #660066\">biscoito<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'usu\u00e1rio'<\/span><span style=\"color: #339933\">,<\/span> novoUsu\u00e1rio<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\ndb.<span style=\"color: #660066\">upsert<\/span><span style=\"color: #009900\">(<\/span>novoUsu\u00e1rio<span style=\"color: #339933\">,<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #339933\">,<\/span> res<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR CREATING:\"<\/span> <span style=\"color: #339933\">+<\/span> erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\nfeito<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR CREATING:\"<\/span> <span style=\"color: #339933\">+<\/span> erro<span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:\"<\/span> <span style=\"color: #339933\">+<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">+<\/span> <span style=\"color: #3366cc\">\":SUCCESS\"<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\nfeito<span style=\"color: #009900\">(<\/span><span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">\"LOGIN:\"<\/span> <span style=\"color: #339933\">+<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">+<\/span> <span style=\"color: #3366cc\">\":SUCCESS\"<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span> <span style=\"color: #000066;font-weight: bold\">mais<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>usu\u00e1rio<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR:\"<\/span> <span style=\"color: #339933\">+<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">+<\/span> <span style=\"color: #3366cc\">\" EXISTE\"<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\nfeito<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR:\"<\/span> <span style=\"color: #339933\">+<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">+<\/span> <span style=\"color: #3366cc\">\" existe - escolha um nome de usu\u00e1rio diferente\"<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR:END:\"<\/span> <span style=\"color: #339933\">+<\/span> erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\nfeito<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR\"<\/span> <span style=\"color: #339933\">+<\/span> erro<span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span> <span style=\"color: #000066;font-weight: bold\">mais<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERRO:VIOLA\u00c7\u00c3O DE PALAVRA\"<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\nfeito<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"LOGIN:ERROR, TERMO PROIBIDO NO NOME DE USU\u00c1RIO\"<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Em seguida, uma fun\u00e7\u00e3o de \"middleware\" muito pequena verifica se um usu\u00e1rio configurou uma sess\u00e3o antes de rotear as solicita\u00e7\u00f5es de entrada.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> isLoggedIn<span style=\"color: #009900\">(<\/span>req<span style=\"color: #339933\">,<\/span> res<span style=\"color: #339933\">,<\/span> pr\u00f3xima<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>req.<span style=\"color: #660066\">cookies<\/span>.<span style=\"color: #660066\">usu\u00e1rio<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> pr\u00f3xima<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\nres.<span style=\"color: #660066\">redirecionar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">&#8216;\/&#8217;<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Uma outra fun\u00e7\u00e3o de \"middleware\" verifica se uma contagem regressiva est\u00e1 definida ou se esse leil\u00e3o est\u00e1 fechado.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">m\u00f3dulo.<span style=\"color: #660066\">exporta\u00e7\u00f5es<\/span>.<span style=\"color: #660066\">isActive<\/span> <span style=\"color: #339933\">=<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span><span style=\"color: #009900\">(<\/span>req<span style=\"color: #339933\">,<\/span>res<span style=\"color: #339933\">,<\/span>pr\u00f3xima<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ndb.<span style=\"color: #660066\">ler<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"estado<\/span><span style=\"color: #339933\">,<\/span><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span><span style=\"color: #009900\">(<\/span>erro<span style=\"color: #339933\">,<\/span>feito<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span><span style=\"color: #009900\">(<\/span>feito.<span style=\"color: #660066\">valor<\/span>.<span style=\"color: #660066\">ativo<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> pr\u00f3xima<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #000066;font-weight: bold\">mais<\/span><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span><span style=\"color: #009900\">(<\/span>feito.<span style=\"color: #660066\">valor<\/span>.<span style=\"color: #660066\">contagem regressiva<\/span> <span style=\"color: #339933\">!=<\/span> <span style=\"color: #3366cc\">\"nenhum\"<\/span><span style=\"color: #009900\">)<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\nres.<span style=\"color: #660066\">renderizar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'countdown.jade'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #000066;font-weight: bold\">mais<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ndb.<span style=\"color: #660066\">ler<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"bicicleta<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #339933\">,<\/span> cb<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\nres.<span style=\"color: #660066\">renderizar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"vencedor<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #009900\">{<\/span>usu\u00e1rio<span style=\"color: #339933\">:<\/span> req.<span style=\"color: #660066\">cookies<\/span>.<span style=\"color: #660066\">usu\u00e1rio<\/span><span style=\"color: #339933\">,<\/span> quantidade<span style=\"color: #339933\">:<\/span> cb.<span style=\"color: #660066\">valor<\/span>.<span style=\"color: #660066\">oferta<\/span><span style=\"color: #339933\">,<\/span> alta<span style=\"color: #339933\">:<\/span> cb.<span style=\"color: #660066\">valor<\/span>.<span style=\"color: #660066\">alta<\/span><span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<h3>Intera\u00e7\u00e3o com o usu\u00e1rio<\/h3>\n<p>O arquivo app.js controla o funcionamento do aplicativo.   Todas as rotas s\u00e3o definidas no objeto routes.js em um arquivo espec\u00edfico.  O objeto do aplicativo \u00e9 passado para o objeto routes.  Essa \u00e9 uma prefer\u00eancia estil\u00edstica que facilita a funcionalidade do middleware (conforme usado nos exemplos acima).   A API REST \u00e9 direta: Os seguintes m\u00e9todos s\u00e3o expostos:<\/p>\n<p>POST api\/auction\/login [definir uma sess\u00e3o, cookie, para cada usu\u00e1rio \u00fanico]<br \/>\nGET api\/auction\/login [m\u00e9todo de seguran\u00e7a, em caso de atualiza\u00e7\u00e3o da p\u00e1gina]<br \/>\nGET api\/auction\/load [carregar a p\u00e1gina do leil\u00e3o]<br \/>\nPOST api\/auction\/bid [definir um lance, com valida\u00e7\u00e3o]<br \/>\nGET api\/auction\/bid [m\u00e9todo de seguran\u00e7a, em caso de atualiza\u00e7\u00e3o da p\u00e1gina]<br \/>\nGET api\/auction\/get [obter o maior lance atual]<br \/>\nPOST api\/auction\/open\/:password [redefine o leil\u00e3o, libera o balde e define o leil\u00e3o como aberto]<br \/>\nPOST api\/auction\/close\/:password [definir leil\u00e3o como fechado]<br \/>\nPOST api\/auction\/view\/build [definir uma visualiza\u00e7\u00e3o a ser usada para examinar o hist\u00f3rico de lances]<br \/>\nGET api\/auction\/view\/get [obter visualiza\u00e7\u00e3o do hist\u00f3rico de lances]<br \/>\nGET api\/auction\/countdown\/get [obter o tempo em segundos entre o leil\u00e3o \"ir ao ar\" e agora]<br \/>\nPOST api\/auction\/countdown\/set\/:yyyy\/:mm\/:dd\/:hh [definir data de entrada em vigor do leil\u00e3o]<br \/>\nPOST api\/auction\/countdown\/del\/:password [definir a contagem regressiva do leil\u00e3o como nenhum e o leil\u00e3o como ativo]<\/p>\n<h3>Atualiza\u00e7\u00f5es din\u00e2micas<\/h3>\n<p>Na demonstra\u00e7\u00e3o principal, v\u00e1rios usu\u00e1rios d\u00e3o lances simultaneamente em dois clusters diferentes, e todas as atualiza\u00e7\u00f5es precisam ser imediatamente propagadas para qualquer outro usu\u00e1rio que esteja visualizando a p\u00e1gina do leil\u00e3o.  H\u00e1 v\u00e1rias maneiras de fazer isso, cada uma com vantagens e desvantagens.   Esse aplicativo espec\u00edfico carrega a p\u00e1gina de leil\u00e3o por meio de um modelo jade.  O modelo jade instancia um loop de sondagem jquery ajax.  Esse loop pesquisa o endpoint \/api\/auction\/get REST duas vezes a cada segundo para determinar o maior lance.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p>setInterval<span style=\"color: #009900\">(<\/span><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\npollBid<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #cc0000\">500<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> pollBid<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n$.<span style=\"color: #660066\">obter<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'\/api\/auction\/get'<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>cb<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>cb<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n$<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"#bid\"<\/span><span style=\"color: #009900\">)<\/span>.<span style=\"color: #660066\">html<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">&#8220;$&#8221;<\/span> <span style=\"color: #339933\">+<\/span> cb.<span style=\"color: #660066\">oferta<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n$<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"#high\"<\/span><span style=\"color: #009900\">)<\/span>.<span style=\"color: #660066\">html<\/span><span style=\"color: #009900\">(<\/span>cb.<span style=\"color: #660066\">alta<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">mais<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<\/div>\n<\/div>\n<h2>Administra\u00e7\u00e3o<\/h2>\n<p>Os m\u00e9todos a seguir s\u00e3o chamados usando comandos curl durante a demonstra\u00e7\u00e3o para definir os estados do leil\u00e3o.   A sequ\u00eancia para a demonstra\u00e7\u00e3o \u00e9 redefinir o leil\u00e3o, definir uma data de entrada em opera\u00e7\u00e3o, definir o leil\u00e3o em opera\u00e7\u00e3o quando a palestra come\u00e7ar e fechar o leil\u00e3o.<\/p>\n<p>curl -X POST https:\/\/localhost:3001\/api\/auction\/open\/un5ecure_pa55word<br \/>\ncurl -X POST https:\/\/localhost:3001\/api\/countdown\/set\/2014\/10\/06\/13<br \/>\ncurl -X POST https:\/\/localhost:3001\/api\/countdown\/del\/un5ecure_pa55word<br \/>\ncurl -X POST https:\/\/localhost:3001\/api\/auction\/close\/un5ecure_pa55word<\/p>\n<h2>Fonte e considera\u00e7\u00f5es<\/h2>\n<p>Grande parte da funcionalidade deste aplicativo \u00e9 codificada e espec\u00edfica para este caso de uso de demonstra\u00e7\u00e3o de palestra.   O modelo de dados \u00e9 espec\u00edfico para esse caso de uso e s\u00f3 \u00e9 aplic\u00e1vel como prova de conceito.   O caso de uso n\u00e3o tem acesso seguro ou autentica\u00e7\u00e3o.  Ao implantar em diferentes clusters vinculados pelo XDCR, \u00e9 necess\u00e1ria uma administra\u00e7\u00e3o adicional para \"redefinir\" o leil\u00e3o.   N\u00e3o \u00e9 poss\u00edvel \"liberar\" os compartimentos que est\u00e3o participando atualmente do XDCR.<\/p>\n<p><strong>** Isen\u00e7\u00e3o de responsabilidade: o Couchbase Labs fornece c\u00f3digo experimental apenas para fins de pesquisa e desenvolvimento.   O c\u00f3digo e os aplicativos do Couchbase Labs n\u00e3o s\u00e3o suportados por nenhum contrato de suporte do Couchbase e s\u00e3o fornecidos no estado em que se encontram, sem garantia de qualquer tipo. \u00a0<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Node.js + Couchbase 3.0 + SDK 2.0 + Bootstrap Requirements When it came time to build a product demonstration for the Couchbase Connect Conference the following requirements were established: [1] It must be a live demo, with audience participation &#8212; [&hellip;]<\/p>","protected":false},"author":20,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1822],"tags":[1254],"ppma_author":[9019],"class_list":["post-1544","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-node-js","tag-express"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase Connect 2014 Keynote Demo Application<\/title>\n<meta name=\"description\" content=\"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.\" \/>\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\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase Connect 2014 Keynote Demo Application - How We Did It\" \/>\n<meta property=\"og:description\" content=\"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-17T15:43:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:50:08+00:00\" \/>\n<meta name=\"author\" content=\"Todd Greenstein\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@todd_greenstein\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Todd Greenstein\" \/>\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-connect-2014-keynote-demo-application-how-we-did-it\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\"},\"author\":{\"name\":\"Todd Greenstein\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/64b5d1e5969768c5d63c11c696951ed3\"},\"headline\":\"Couchbase Connect 2014 Keynote Demo Application &#8211; How We Did It\",\"datePublished\":\"2014-12-17T15:43:14+00:00\",\"dateModified\":\"2025-06-14T06:50:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\"},\"wordCount\":1061,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"express\"],\"articleSection\":[\"Node.js\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\",\"name\":\"Couchbase Connect 2014 Keynote Demo Application\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-17T15:43:14+00:00\",\"dateModified\":\"2025-06-14T06:50:08+00:00\",\"description\":\"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#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-connect-2014-keynote-demo-application-how-we-did-it\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase Connect 2014 Keynote Demo Application &#8211; How We Did It\"}]},{\"@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\/64b5d1e5969768c5d63c11c696951ed3\",\"name\":\"Todd Greenstein\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abfbe093983052aa28595343c19888ce\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g\",\"caption\":\"Todd Greenstein\"},\"description\":\"Todd Greenstein is a Solution Architect at Couchbase. Todd is specialize in API design, architecture, data modeling, nodejs and golang development.\",\"sameAs\":[\"https:\/\/x.com\/todd_greenstein\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/todd-greenstein\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase Connect 2014 Keynote Demo Application","description":"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.","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\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/","og_locale":"pt_BR","og_type":"article","og_title":"Couchbase Connect 2014 Keynote Demo Application - How We Did It","og_description":"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-17T15:43:14+00:00","article_modified_time":"2025-06-14T06:50:08+00:00","author":"Todd Greenstein","twitter_card":"summary_large_image","twitter_creator":"@todd_greenstein","twitter_misc":{"Written by":"Todd Greenstein","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/"},"author":{"name":"Todd Greenstein","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/64b5d1e5969768c5d63c11c696951ed3"},"headline":"Couchbase Connect 2014 Keynote Demo Application &#8211; How We Did It","datePublished":"2014-12-17T15:43:14+00:00","dateModified":"2025-06-14T06:50:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/"},"wordCount":1061,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["express"],"articleSection":["Node.js"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/","name":"Couchbase Connect 2014 Keynote Demo Application","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-17T15:43:14+00:00","dateModified":"2025-06-14T06:50:08+00:00","description":"Learn more about building a product demonstration for the Couchbase Connect Conference. Also, check what requirements were established.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-connect-2014-keynote-demo-application-how-we-did-it\/#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-connect-2014-keynote-demo-application-how-we-did-it\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase Connect 2014 Keynote Demo Application &#8211; How We Did It"}]},{"@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\/64b5d1e5969768c5d63c11c696951ed3","name":"Todd Greenstein","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abfbe093983052aa28595343c19888ce","url":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","caption":"Todd Greenstein"},"description":"Todd Greenstein is a Solution Architect at Couchbase. Todd is specialize in API design, architecture, data modeling, nodejs and golang development.","sameAs":["https:\/\/x.com\/todd_greenstein"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/todd-greenstein\/"}]}},"authors":[{"term_id":9019,"user_id":20,"is_guest":0,"slug":"todd-greenstein","display_name":"Todd Greenstein","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","first_name":"Todd","last_name":"Greenstein","user_url":"","author_category":"","description":"Todd Greenstein \u00e9 arquiteto de solu\u00e7\u00f5es na Couchbase. Todd \u00e9 especializado em design de API, arquitetura, modelagem de dados, desenvolvimento em nodejs e golang."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1544","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\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1544"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1544\/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=1544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1544"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}