{"id":1614,"date":"2014-12-16T19:32:00","date_gmt":"2014-12-16T19:31:59","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1614"},"modified":"2023-06-28T00:24:10","modified_gmt":"2023-06-28T07:24:10","slug":"game-servers-and-couchbase-nodejs-part-1","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/game-servers-and-couchbase-nodejs-part-1\/","title":{"rendered":"Servidores de jogos e Couchbase com Node.js - Parte 1"},"content":{"rendered":"<p>Atualmente, parece que quase todos os est\u00fadios de jogos est\u00e3o trabalhando em jogos em rede nos quais os jogadores podem interagir e cooperar com seus amigos e outros jogadores do mundo todo. Considerando minha experi\u00eancia anterior na cria\u00e7\u00e3o de servidores desse tipo e que o Couchbase se encaixa como um armazenamento de backup para um sistema como esse, pensei que talvez esse fosse um excelente t\u00f3pico para escrever! Escreverei este artigo em v\u00e1rias partes, cada uma delas implementando um aspecto espec\u00edfico do servidor de jogos. Al\u00e9m disso, farei o mesmo tutorial usando nossa biblioteca de cliente PHP para mostr\u00e1-lo tamb\u00e9m.<\/p>\n<h1>Layout do projeto<\/h1>\n<p>Para come\u00e7ar, precisamos configurar algumas coisas b\u00e1sicas que nos permitam enviar e receber solicita\u00e7\u00f5es HTTP, bem como nos conectar ao nosso cluster do Couchbase. Se ainda n\u00e3o tiver certeza de como fazer isso, d\u00ea uma olhada no meu artigo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/intro-and-couchnode-100\/\">postagem anterior do blog<\/a> onde explico com um pouco mais de detalhes do que farei a seguir. Iniciaremos nosso projeto com uma estrutura de diret\u00f3rios t\u00edpica do Node.js com algumas pastas extras para ajudar a organizar o c\u00f3digo do servidor de jogos.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\/lib\/<br \/>\n\/lib\/models\/<br \/>\n\/lib\/app.js<br \/>\n\/lib\/database.js<br \/>\n\/package.json<\/div>\n<\/div>\n<p>De acordo com a estrutura normal do Node.js, come\u00e7amos com a pasta 'lib' para armazenar todos os nossos arquivos de origem, com um lib\/server.js para atuar como o arquivo principal e, por fim, nosso package.json para descrever as depend\u00eancias do projeto e outros metadados. Al\u00e9m disso, adicionamos um database.js que gerenciar\u00e1 centralmente nossa conex\u00e3o com o banco de dados para evitar que tenhamos de instanciar uma nova conex\u00e3o para cada solicita\u00e7\u00e3o, bem como a pasta \/lib\/models\/ que usaremos para manter o c\u00f3digo-fonte de nossos v\u00e1rios modelos de banco de dados.<\/p>\n<h1>O b\u00e1sico<\/h1>\n<p>Here is some content for your package.json. We give our project a name, point to its main Javascript file and then define a couple of prerequisite modules we will need later on. Once you have saved this file, executing `npm install` in your project root directory should install the referenced dependancies.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"principal\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\".\/lib\/app\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"licen\u00e7a\"<\/span> <span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Apache2\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"name\" (nome)<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"gameapi-couchbase\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"dependencies\" (depend\u00eancias)<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"couchbase\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">&#8220;~1.0.0&#8221;<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"expresso\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">&#8220;~3.4.0&#8221;<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"uuid\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">&#8220;~1.4.1&#8221;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"devDependencies\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"vers\u00e3o\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">&#8220;0.0.1&#8221;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Nossa pr\u00f3xima etapa \u00e9 configurar o n\u00facleo do nosso servidor de jogos. Isso \u00e9 colocado em nosso arquivo \/lib\/app.js. Examinarei as se\u00e7\u00f5es desse arquivo bloco por bloco e explicarei o que cada uma delas faz.<\/p>\n<p>Primeiro, precisamos importar os m\u00f3dulos de que precisaremos nesse arquivo. No momento, precisamos apenas do m\u00f3dulo express para roteamento e an\u00e1lise de HTTP, mas, mais adiante neste tutorial, adicionaremos mais coisas a ele.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">var<\/span> expresso <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"expresso<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Em seguida, vamos configurar o Express. Al\u00e9m disso, anexamos o subm\u00f3dulo bodyParser do Express para que possamos analisar os corpos JSON POST e PUT. Isso ser\u00e1 \u00fatil mais tarde, quando nossos clientes de jogos precisarem nos passar blocos de dados JSON.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">var<\/span> aplicativo <span style=\"color: #339933\">=<\/span> expresso<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\naplicativo.<span style=\"color: #003366;font-weight: bold\">uso<\/span><span style=\"color: #009900\">(<\/span>expresso.<span style=\"color: #660066\">bodyParser<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Apenas para fins de demonstra\u00e7\u00e3o, vamos adicionar uma rota simples ao nosso servidor HTTP para lidar com solicita\u00e7\u00f5es \u00e0 raiz do nosso servidor.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">aplicativo.<span style=\"color: #660066\">obter<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">&#8216;\/&#8217;<\/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 \/>\nres.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">{<\/span>lacaios<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">Curvem-se diante de mim, pois eu sou a RAIZ!<\/span><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: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Por fim, vamos colocar nosso servidor HTTP escutando na porta 3000.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">aplicativo.<span style=\"color: #660066\">ouvir<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">3000<\/span><span style=\"color: #339933\">,<\/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 \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'Listening on port 3000' (Escutando na porta 3000)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Esta \u00e9 uma ideia aproximada de como deve ser seu app.js at\u00e9 o momento:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> expresso <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">\"expresso<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> aplicativo <span style=\"color: #339933\">=<\/span> expresso<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\naplicativo.<span style=\"color: #003366;font-weight: bold\">uso<\/span><span style=\"color: #009900\">(<\/span>expresso.<span style=\"color: #660066\">bodyParser<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>aplicativo.<span style=\"color: #660066\">obter<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">&#8216;\/&#8217;<\/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 \/>\nres.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">{<\/span>lacaios<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">Curvem-se diante de mim, pois eu sou a RAIZ!<\/span><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: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>aplicativo.<span style=\"color: #660066\">ouvir<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">3000<\/span><span style=\"color: #339933\">,<\/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 \/>\nconsole.<span style=\"color: #660066\">registro<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'Listening on port 3000' (Escutando na porta 3000)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>For the last bit of our project basics, lets set up our database connection. The code is fairly straightforward, we import the couchbase module and subsequently export a new connection to our locally hosted server and the bucket &#8216;gameapi&#8217; through a property of the module named `mainBucket`.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> couchbase <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'couchbase'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #006600;font-style: italic\">\/\/ Conectar-se ao nosso servidor Couchbase<\/span><\/p>\n<\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">m\u00f3dulo.<span style=\"color: #660066\">exporta\u00e7\u00f5es<\/span>.<span style=\"color: #660066\">mainBucket<\/span> <span style=\"color: #339933\">=<\/span> <span style=\"color: #003366;font-weight: bold\">novo<\/span> couchbase.<span style=\"color: #660066\">Conex\u00e3o<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">{<\/span>balde<span style=\"color: #339933\">:<\/span><span style=\"color: #3366cc\">'gameapi'<\/span><span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/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><span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>At this point if you open a terminal in your project root and execute `node lib\/app.js`, you should see the message &#8220;Listening on port 3000&#8221;. You can also now point your browser to `https:\/\/localhost:3000` and see our work so far in action.<\/p>\n<p>\u00c9 nesse ponto que sugiro que voc\u00ea instale um aplicativo que permita criar solicita\u00e7\u00f5es HTTP espec\u00edficas. Pessoalmente, adoro a extens\u00e3o POSTman para o Google Chrome. Isso ser\u00e1 importante mais tarde, quando voc\u00ea quiser testar endpoints que n\u00e3o sejam simples solicita\u00e7\u00f5es GET!<\/p>\n<h1>Cria\u00e7\u00e3o de conta - Modelo de conta<\/h1>\n<p>Now that we have our basic server running, lets starting working on the &#8216;game&#8217; portion of our game server. We are going to start by implementing the account creation endpoint which will be accessible by doing a POST request to the `\/users` URI. To start this process, we are going to first build a model for our endpoint handler to deal with to abstract some of the details of our database implementation. These models are where the bulk of our interactions with Couchbase Server will happen.<\/p>\n<p>Lets first start by creating a new file in our `\/lib\/models` folder called &#8216;accountmodel.js&#8217;. Once you&#8217;ve got your accountmodel.js file ready and opened, lets start by importing some of the modules we will need.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">var<\/span> uuid <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'uuid'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> couchbase <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'couchbase'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> db <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'.\/..\/database'<\/span><span style=\"color: #009900\">)<\/span>.<span style=\"color: #660066\">mainBucket<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Como voc\u00ea pode ver, h\u00e1 quatro m\u00f3dulos de que precisaremos neste momento. Usaremos o m\u00f3dulo uuid para gerar UUIDs para nossos objetos de banco de dados. Vi muitas pessoas usando contadores de sequ\u00eancia implementados usando o sistema incr\/decr do Couchbase, mas prefiro muito mais o m\u00e9todo UUID que usarei aqui, pois ele evita a necessidade de fazer uma opera\u00e7\u00e3o adicional no banco de dados. Em seguida, importamos o m\u00f3dulo couchbase, que usaremos para acessar v\u00e1rias constantes de que precisaremos (principalmente erros). E, por fim, importamos o m\u00f3dulo de banco de dados e obtemos a conex\u00e3o com o bucket gameapi que criamos anteriormente.<\/p>\n<p>Em seguida, definimos uma fun\u00e7\u00e3o auxiliar simples que ajudar\u00e1 a remover quaisquer propriedades em n\u00edvel de banco de dados de que nosso modelo precise e que n\u00e3o sejam importantes para o restante do servidor. No momento, a propriedade \"type\" \u00e9 a \u00fanica propriedade que ser\u00e1 removida. Essa propriedade ser\u00e1 usada pela gameapi para identificar que tipo de objeto \u00e9 um determinado item em nosso balde ao fazer redu\u00e7\u00f5es de mapa posteriormente.<\/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> cleanUserObj<span style=\"color: #009900\">(<\/span>obj<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">excluir<\/span> obj.<span style=\"color: #660066\">tipo<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> obj<span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Agora, definimos nossa classe AccountModel.<\/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> AccountModel<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>E exportar a classe para outros arquivos que importam essa classe. Sugiro que voc\u00ea mantenha essa declara\u00e7\u00e3o sempre na parte inferior do arquivo para facilitar a localiza\u00e7\u00e3o quando estiver tentando identificar o que um determinado arquivo exporta.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">m\u00f3dulo.<span style=\"color: #660066\">exporta\u00e7\u00f5es<\/span> <span style=\"color: #339933\">=<\/span> AccountModel<span style=\"color: #339933\">;<\/span><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<\/div>\n<p>Agora que nosso modelo boilerplate est\u00e1 pronto, podemos criar nossa fun\u00e7\u00e3o create, que nos permitir\u00e1 criar um objeto de usu\u00e1rio. Dividirei essa fun\u00e7\u00e3o em partes menores para simplificar a explica\u00e7\u00e3o.<\/p>\n<p>Vamos come\u00e7ar com a defini\u00e7\u00e3o da fun\u00e7\u00e3o em si.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">AccountModel.<span style=\"color: #660066\">criar<\/span> <span style=\"color: #339933\">=<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span><span style=\"color: #009900\">(<\/span>usu\u00e1rio<span style=\"color: #339933\">,<\/span> retorno de chamada<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>Em seguida, vamos criar um objeto que ser\u00e1 inserido em nosso bucket do Couchbase. Especificamos um tipo para o objeto, que, conforme mencionado acima, ser\u00e1 usado posteriormente. Geramos um UID para o usu\u00e1rio, o que nos ajudar\u00e1 a fazer refer\u00eancia ao nosso usu\u00e1rio em todo o processo. Por fim, copiamos os detalhes do usu\u00e1rio que foram passados para a fun\u00e7\u00e3o de cria\u00e7\u00e3o. Voc\u00ea pode notar que n\u00e3o realizamos nenhuma valida\u00e7\u00e3o nos dados que est\u00e3o sendo passados para o nosso modelo. Isso ocorre porque, na maioria das vezes, nosso c\u00f3digo de tratamento de solicita\u00e7\u00f5es ter\u00e1 uma ideia melhor do que aceitar ou n\u00e3o aceitar, e nosso modelo \u00e9 respons\u00e1vel apenas por armazenar os dados. Por \u00faltimo, geramos uma chave que ser\u00e1 usada para fazer refer\u00eancia a esse documento. Para isso, usamos o tipo de documento e o UID do usu\u00e1rio.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> userDoc <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ntipo<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">'usu\u00e1rio'<\/span><span style=\"color: #339933\">,<\/span><br \/>\nuid<span style=\"color: #339933\">:<\/span> uuid.<span style=\"color: #660066\">v4<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #000066\">nome<\/span><span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #000066\">nome<\/span><span style=\"color: #339933\">,<\/span><br \/>\nnome de usu\u00e1rio<span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #339933\">,<\/span><br \/>\nsenha<span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #660066\">senha<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> userDocName <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">'usu\u00e1rio-'<\/span> <span style=\"color: #339933\">+<\/span> userDoc.<span style=\"color: #660066\">uid<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>Para que possamos encontrar esse usu\u00e1rio no futuro pelo seu nome de usu\u00e1rio (provavelmente n\u00e3o \u00e9 uma boa ideia fazer com que seus usu\u00e1rios se lembrem de seus UIDs!), criaremos um \"documento referencial\", ou seja, um documento com uma chave baseada no nome de usu\u00e1rio que aponta para o documento do nosso usu\u00e1rio (usando seu UID). Isso tamb\u00e9m tem o benef\u00edcio adicional de evitar que v\u00e1rios usu\u00e1rios tenham o mesmo nome de usu\u00e1rio.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">var<\/span> refDoc <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ntipo<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">'nome de usu\u00e1rio'<\/span><span style=\"color: #339933\">,<\/span><br \/>\nuid<span style=\"color: #339933\">:<\/span> userDoc.<span style=\"color: #660066\">uid<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> refDocName <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">'nome de usu\u00e1rio-'<\/span> <span style=\"color: #339933\">+<\/span> userDoc.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<\/div>\n<p>Por fim, precisamos inserir esses documentos em nosso bucket do Couchbase. Primeiro, inserimos o documento referencial e tratamos o erro keyAlreadyExists especificamente retornando uma mensagem avisando ao usu\u00e1rio que o nome de usu\u00e1rio j\u00e1 foi usado e simplesmente repassando quaisquer outros erros (provavelmente dever\u00edamos envolver nossos erros do Couchbase no n\u00edvel do modelo, mas isso n\u00e3o \u00e9 importante neste ponto da s\u00e9rie). O fato de inserirmos os documentos referenciais primeiro aqui \u00e9 importante porque ++TODO++ Por que isso \u00e9 importante mesmo? -TODO-. Em seguida, inserimos o pr\u00f3prio documento do usu\u00e1rio e, por fim, invocamos o retorno de chamada que nos foi passado. Primeiro, higienizamos o objeto retornado usando a fun\u00e7\u00e3o que criamos anteriormente para garantir que nenhuma das nossas propriedades no n\u00edvel do banco de dados vaze para outras camadas do nosso aplicativo. Voc\u00ea tamb\u00e9m pode notar que estamos passando um valor 'cas' por meio do nosso retorno de chamada. Isso ser\u00e1 importante mais tarde, quando precisarmos executar <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/optimistic-or-pessimistic-locking-which-one-should-you-pick\/\">bloqueio otimista<\/a> em nosso objeto Account.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p>db.<span style=\"color: #660066\">adicionar<\/span><span style=\"color: #009900\">(<\/span>refDocName<span style=\"color: #339933\">,<\/span> refDoc<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: #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\">keyAlreadyExists<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'O nome de usu\u00e1rio especificado j\u00e1 existe'<\/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: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p>db.<span style=\"color: #660066\">adicionar<\/span><span style=\"color: #009900\">(<\/span>userDocName<span style=\"color: #339933\">,<\/span> userDoc<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> resultado<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 \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p>retorno de chamada<span style=\"color: #009900\">(<\/span><span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #339933\">,<\/span> cleanUserObj<span style=\"color: #009900\">(<\/span>userDoc<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">,<\/span> resultado.<span style=\"color: #660066\">cas<\/span><span style=\"color: #009900\">)<\/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: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>Este \u00e9 o aspecto que seu arquivo accountmodel.js deve ter at\u00e9 o momento:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> uuid <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'uuid'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> couchbase <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'couchbase'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> db <span style=\"color: #339933\">=<\/span> exigir<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'.\/..\/database'<\/span><span style=\"color: #009900\">)<\/span>.<span style=\"color: #660066\">mainBucket<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> cleanUserObj<span style=\"color: #009900\">(<\/span>obj<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">excluir<\/span> obj.<span style=\"color: #660066\">tipo<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> obj<span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> AccountModel<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p>AccountModel.<span style=\"color: #660066\">criar<\/span> <span style=\"color: #339933\">=<\/span> <span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span><span style=\"color: #009900\">(<\/span>usu\u00e1rio<span style=\"color: #339933\">,<\/span> retorno de chamada<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> userDoc <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ntipo<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">'usu\u00e1rio'<\/span><span style=\"color: #339933\">,<\/span><br \/>\nuid<span style=\"color: #339933\">:<\/span> uuid.<span style=\"color: #660066\">v4<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #000066\">nome<\/span><span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #000066\">nome<\/span><span style=\"color: #339933\">,<\/span><br \/>\nnome de usu\u00e1rio<span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #339933\">,<\/span><br \/>\nsenha<span style=\"color: #339933\">:<\/span> usu\u00e1rio.<span style=\"color: #660066\">senha<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> userDocName <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">'usu\u00e1rio-'<\/span> <span style=\"color: #339933\">+<\/span> userDoc.<span style=\"color: #660066\">uid<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> refDoc <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">{<\/span><br \/>\ntipo<span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">'nome de usu\u00e1rio'<\/span><span style=\"color: #339933\">,<\/span><br \/>\nuid<span style=\"color: #339933\">:<\/span> userDoc.<span style=\"color: #660066\">uid<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #003366;font-weight: bold\">var<\/span> refDocName <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">'nome de usu\u00e1rio-'<\/span> <span style=\"color: #339933\">+<\/span> userDoc.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>db.<span style=\"color: #660066\">adicionar<\/span><span style=\"color: #009900\">(<\/span>refDocName<span style=\"color: #339933\">,<\/span> refDoc<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: #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\">keyAlreadyExists<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'O nome de usu\u00e1rio especificado j\u00e1 existe'<\/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: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p>db.<span style=\"color: #660066\">adicionar<\/span><span style=\"color: #009900\">(<\/span>userDocName<span style=\"color: #339933\">,<\/span> userDoc<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> resultado<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 \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> retorno de chamada<span style=\"color: #009900\">(<\/span>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p>retorno de chamada<span style=\"color: #009900\">(<\/span><span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #339933\">,<\/span> cleanUserObj<span style=\"color: #009900\">(<\/span>userDoc<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">,<\/span> resultado.<span style=\"color: #660066\">cas<\/span><span style=\"color: #009900\">)<\/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: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>m\u00f3dulo.<span style=\"color: #660066\">exporta\u00e7\u00f5es<\/span> <span style=\"color: #339933\">=<\/span> AccountModel<span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<h1>Cria\u00e7\u00e3o de conta - Tratamento de solicita\u00e7\u00f5es<\/h1>\n<p>Agora que conclu\u00edmos a fun\u00e7\u00e3o create em nosso modelo de conta, podemos escrever uma rota expressa para lidar com solicita\u00e7\u00f5es de cria\u00e7\u00e3o de contas e passar essas solicita\u00e7\u00f5es para a nossa fun\u00e7\u00e3o. Primeiro, precisamos definir uma rota.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">aplicativo.<span style=\"color: #660066\">postagem<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'\/usu\u00e1rios'<\/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 \/>\n<span style=\"color: #006600;font-style: italic\">\/\/ Os pr\u00f3ximos bits v\u00e3o para c\u00e1!<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/div>\n<\/div>\n<p>E... execute alguma valida\u00e7\u00e3o para garantir que os dados necess\u00e1rios foram passados para o endpoint.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #000066\">nome<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar um nome'<\/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\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar um nome de usu\u00e1rio'<\/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\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #660066\">senha<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar uma senha'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Uma vez que os dados tenham sido *tussa* \"validados\" *\/tussa*, podemos gerar o hash SHA1 para a senha do usu\u00e1rio (nunca armazene as senhas de um usu\u00e1rio em texto simples!) e, em seguida, executar a fun\u00e7\u00e3o de cria\u00e7\u00e3o que criamos anteriormente neste post. Voc\u00ea tamb\u00e9m pode notar que eu removo a senha do usu\u00e1rio do objeto user antes de pass\u00e1-la de volta para o cliente. Isso \u00e9 novamente para seguran\u00e7a, pois queremos limitar a transmiss\u00e3o da senha do usu\u00e1rio (em qualquer formato) o m\u00e1ximo poss\u00edvel.<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><\/div>\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">=<\/span> req.<span style=\"color: #660066\">corpo<\/span><span style=\"color: #339933\">;<\/span><br \/>\nnewUser.<span style=\"color: #660066\">senha<\/span> <span style=\"color: #339933\">=<\/span> cripta.<span style=\"color: #660066\">sha1<\/span><span style=\"color: #009900\">(<\/span>newUser.<span style=\"color: #660066\">senha<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>accountModel.<span style=\"color: #660066\">criar<\/span><span style=\"color: #009900\">(<\/span>req.<span style=\"color: #660066\">corpo<\/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> 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: #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>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p><span style=\"color: #000066;font-weight: bold\">excluir<\/span> usu\u00e1rio.<span style=\"color: #660066\">senha<\/span><span style=\"color: #339933\">;<\/span><br \/>\nres.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span>usu\u00e1rio<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>Para resumir, toda a rota de cria\u00e7\u00e3o de conta deve ter a seguinte apar\u00eancia:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\">\n<p>aplicativo.<span style=\"color: #660066\">postagem<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'\/usu\u00e1rios'<\/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 \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #000066\">nome<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar um nome'<\/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\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #660066\">nome de usu\u00e1rio<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar um nome de usu\u00e1rio'<\/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\">se<\/span> <span style=\"color: #009900\">(<\/span><span style=\"color: #339933\">!<\/span>req.<span style=\"color: #660066\">corpo<\/span>.<span style=\"color: #660066\">senha<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">retorno<\/span> res.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #cc0000\">400<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #3366cc\">'Deve especificar uma senha'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p><span style=\"color: #003366;font-weight: bold\">var<\/span> novoUsu\u00e1rio <span style=\"color: #339933\">=<\/span> req.<span style=\"color: #660066\">corpo<\/span><span style=\"color: #339933\">;<\/span><br \/>\nnewUser.<span style=\"color: #660066\">senha<\/span> <span style=\"color: #339933\">=<\/span> cripta.<span style=\"color: #660066\">sha1<\/span><span style=\"color: #009900\">(<\/span>newUser.<span style=\"color: #660066\">senha<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<p>accountModel.<span style=\"color: #660066\">criar<\/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: #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>erro<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/p>\n<p><span style=\"color: #000066;font-weight: bold\">excluir<\/span> usu\u00e1rio.<span style=\"color: #660066\">senha<\/span><span style=\"color: #339933\">;<\/span><br \/>\nres.<span style=\"color: #660066\">enviar<\/span><span style=\"color: #009900\">(<\/span>usu\u00e1rio<span style=\"color: #009900\">)<\/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: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/p>\n<\/div>\n<\/div>\n<h1>Final<\/h1>\n<p>Bem, finalmente chegamos ao final da parte 1 de nosso tutorial. Muitos dos conceitos b\u00e1sicos j\u00e1 foram abordados, portanto, as pr\u00f3ximas partes da s\u00e9rie dever\u00e3o ser um pouco mais curtas (mas n\u00e3o prometemos nada!). Neste ponto, voc\u00ea deve ser capaz de executar uma solicita\u00e7\u00e3o POST para o ponto de extremidade \/users e criar um novo usu\u00e1rio da seguinte forma:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><\/div>\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">&gt; POST \/users<br \/>\n{<br \/>\n\"nome\": \"Brett Lawson\",<br \/>\n\"nome de usu\u00e1rio\": \"brett19\",<br \/>\n\"senha\": \"success!\"<br \/>\n}<br \/>\n&lt; 200 OK<br \/>\n{<br \/>\n\"uid\": \u201cb836d211-425c-47de-9faf-5d0adc078edc\u201d,<br \/>\n\"nome\": \"Brett Lawson\",<br \/>\n\"nome de usu\u00e1rio\": \"brett19\"<br \/>\n}<\/div>\n<\/div>\n<p>Infelizmente, neste momento n\u00e3o h\u00e1 muito que voc\u00ea possa fazer com suas novas contas, exceto, talvez, maravilhar-se com a exist\u00eancia delas em nosso banco de dados. Espero que fique para a Parte 2, na qual apresentarei as sess\u00f5es e a autentica\u00e7\u00e3o dos usu\u00e1rios que agora podem se registrar.<\/p>\n<p>A fonte completa desse aplicativo est\u00e1 dispon\u00edvel aqui: <a href=\"https:\/\/github.com\/brett19\/node-gameapi\">https:\/\/github.com\/brett19\/node-gameapi<\/a><\/p>\n<p>Aproveite! Brett<\/p>","protected":false},"excerpt":{"rendered":"<p>It seems these days that almost every game studio has been working on networked games where players can interact and co-operate with their friends and other players around the world. Considering my previous experience building such servers and that Couchbase [&hellip;]<\/p>","protected":false},"author":31,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9004],"class_list":["post-1614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"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>Game Servers and Couchbase with Node.js - Part 1<\/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\/pt\/game-servers-and-couchbase-nodejs-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Game Servers and Couchbase with Node.js - Part 1\" \/>\n<meta property=\"og:description\" content=\"It seems these days that almost every game studio has been working on networked games where players can interact and co-operate with their friends and other players around the world. Considering my previous experience building such servers and that Couchbase [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/game-servers-and-couchbase-nodejs-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:31:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-28T07:24:10+00:00\" \/>\n<meta name=\"author\" content=\"Brett Lawson, Principal Software Engineer, 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=\"Brett Lawson, Principal Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/\"},\"author\":{\"name\":\"Brett Lawson, Principal Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5cfc2fbf25776be2a027a474562be02f\"},\"headline\":\"Game Servers and Couchbase with Node.js &#8211; Part 1\",\"datePublished\":\"2014-12-16T19:31:59+00:00\",\"dateModified\":\"2023-06-28T07:24:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/\"},\"wordCount\":2214,\"commentCount\":16,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/\",\"name\":\"Game Servers and Couchbase with Node.js - Part 1\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:31:59+00:00\",\"dateModified\":\"2023-06-28T07:24:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#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\/game-servers-and-couchbase-nodejs-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Game Servers and Couchbase with Node.js &#8211; Part 1\"}]},{\"@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\/5cfc2fbf25776be2a027a474562be02f\",\"name\":\"Brett Lawson, Principal Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ee3586f0c112c20e863af447d44dec8f\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6aec1ba24ef7558a248dcde7b7a18b15b06e2885b24b663906a448634066c1c4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6aec1ba24ef7558a248dcde7b7a18b15b06e2885b24b663906a448634066c1c4?s=96&d=mm&r=g\",\"caption\":\"Brett Lawson, Principal Software Engineer, Couchbase\"},\"description\":\"Brett Lawson is a Principal Software Engineer at Couchbase. Brett is responsible for the design and development of the Couchbase Node.js and PHP clients as well as playing a role in the design and development of the C library, libcouchbase.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/brett-lawson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Game Servers and Couchbase with Node.js - Part 1","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\/game-servers-and-couchbase-nodejs-part-1\/","og_locale":"pt_BR","og_type":"article","og_title":"Game Servers and Couchbase with Node.js - Part 1","og_description":"It seems these days that almost every game studio has been working on networked games where players can interact and co-operate with their friends and other players around the world. Considering my previous experience building such servers and that Couchbase [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/game-servers-and-couchbase-nodejs-part-1\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:31:59+00:00","article_modified_time":"2023-06-28T07:24:10+00:00","author":"Brett Lawson, Principal Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Brett Lawson, Principal Software Engineer, Couchbase","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/"},"author":{"name":"Brett Lawson, Principal Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5cfc2fbf25776be2a027a474562be02f"},"headline":"Game Servers and Couchbase with Node.js &#8211; Part 1","datePublished":"2014-12-16T19:31:59+00:00","dateModified":"2023-06-28T07:24:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/"},"wordCount":2214,"commentCount":16,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/","url":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/","name":"Game Servers and Couchbase with Node.js - Part 1","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:31:59+00:00","dateModified":"2023-06-28T07:24:10+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/game-servers-and-couchbase-nodejs-part-1\/#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\/game-servers-and-couchbase-nodejs-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Game Servers and Couchbase with Node.js &#8211; Part 1"}]},{"@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\/5cfc2fbf25776be2a027a474562be02f","name":"Brett Lawson, engenheiro de software principal, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ee3586f0c112c20e863af447d44dec8f","url":"https:\/\/secure.gravatar.com\/avatar\/6aec1ba24ef7558a248dcde7b7a18b15b06e2885b24b663906a448634066c1c4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6aec1ba24ef7558a248dcde7b7a18b15b06e2885b24b663906a448634066c1c4?s=96&d=mm&r=g","caption":"Brett Lawson, Principal Software Engineer, Couchbase"},"description":"Brett Lawson \u00e9 engenheiro de software principal da Couchbase. Brett \u00e9 respons\u00e1vel pelo projeto e desenvolvimento dos clientes Node.js e PHP do Couchbase, al\u00e9m de desempenhar um papel no projeto e desenvolvimento da biblioteca C, libcouchbase.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/brett-lawson\/"}]}},"authors":[{"term_id":9004,"user_id":31,"is_guest":0,"slug":"brett-lawson","display_name":"Brett Lawson, Principal Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/6aec1ba24ef7558a248dcde7b7a18b15b06e2885b24b663906a448634066c1c4?s=96&d=mm&r=g","first_name":"Brett","last_name":"Lawson","user_url":"","author_category":"","description":"Brett Lawson \u00e9 engenheiro de software principal da Couchbase. Brett \u00e9 respons\u00e1vel pelo projeto e desenvolvimento dos clientes Node.js e PHP do Couchbase, al\u00e9m de desempenhar um papel no projeto e desenvolvimento da biblioteca C, libcouchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1614","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\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1614"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1614\/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=1614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1614"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}