{"componentChunkName":"component---src-templates-blog-post-js","path":"/express-rest-I/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao\" style=\"position:relative;\">Introdução<a href=\"#Introducao\" aria-label=\"Introducao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Neste artigo será mostrado como criar um projeto com <strong>NodeJS</strong> e <strong>Express</strong> e vamos expor uma <strong>API</strong> para podermos realizar as quatro operações básicas de um <strong>CRUD</strong> (criar, ler, atualizar e deletar dados). Também será mostrado como podemos construir um projeto de forma simples, descomplicada, com baixa acoplamento e alta coesão entre seus componentes por meio de injeção de dependências e inversão de controle.</p>\n<p>Fazendo uma breve introdução sobre as tecnologias que serão apresentadas nesse artigo, primeiramente temos o <strong>NodeJS</strong> que é um projeto <em>open-source</em> criado para ser um ambiente de desenvolvimento <em>backend</em> escrito em <strong>JavaScript</strong>, ele explora os benefícios que o <strong>JavaScript</strong> possui, como orientação a eventos e assíncronicidade.</p>\n<p>Juntamente com o <strong>NodeJS</strong> usaremos nesse projeto o <strong>Express</strong> que é um framework para desenvolvimento de aplicações web minimalista, isso significa que ele é bem leve e simples mas que não trás consigo todas as funcionalidades por padrão de um servidor web e isso é uma grande vantagem do <strong>Express</strong> pois é um dos motivos pelo qual ele é muito flexível, e por meio de <em>middlewares</em> é possível plugar <em>libs</em> e ferramentas que nos ajudam no desenvolvimento.</p>\n<h2 id=\"Criando-o-projeto\" style=\"position:relative;\">Criando o projeto<a href=\"#Criando-o-projeto\" aria-label=\"Criando o projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O projeto consistirá em uma agenda de contatos, onde poderemos criar um contato novo, buscar um contato ou todos, editar um existente e deletar um contato.</p>\n<p>Existem algumas maneiras de criar um projeto com <strong>Express</strong>, o próprio <strong>Express</strong> possui um <em>cli</em> para criação.</p>\n<p>Aqui iremos fazer de uma forma que eu considero mais simples que é criar via <strong>command line* com **NPM</strong>.</p>\n<p>Vamos criar uma pasta chamada phonebook e após isso, criar o projeto usando <strong>NPM</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">mkdir</span> phonebook <span class=\"token operator\">&amp;&amp;</span> <span class=\"token builtin class-name\">cd</span> phonebook\n<span class=\"token function\">npm</span> init -y</code></pre></div>\n<p>Com isso temos a estrutura básica do projeto que nada mais é do que um arquivo <em>package.json</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"phonebook\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1.0.0\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"index.js\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"keywords\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"author\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"license\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ISC\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Vamos aproveitar e instalar as dependências que vamos precisar para iniciar esse projeto:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> express body-parser</code></pre></div>\n<p>E também as dependências que usaremos posteriormente para subir o nosso server no ambiente de local de desenvolvimento e testes:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev nodemon jest supertest </code></pre></div>\n<p>Agora falta criarmos o arquivo que será executado quando iniciarmos a aplicação, vamos chamá-lo de <em>index.js</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> bodyParser <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'body-parser'</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">urlencoded</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> extended<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> resp<span class=\"token punctuation\">,</span> next</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    resp<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Access-Control-Allow-Origin'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'*'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> server <span class=\"token operator\">=</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'A API está funcionando!'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> server</code></pre></div>\n<p>Só com isso podemos executar o node chamando o arquivo <em>index.js</em> que deverá funcionar:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> run dev\n\n<span class=\"token operator\">></span> phonebook@1.0.0 dev /Users/guilherme/develop/repo/phonebook\n<span class=\"token operator\">></span> nodemon index.js\n\n<span class=\"token punctuation\">[</span>nodemon<span class=\"token punctuation\">]</span> <span class=\"token number\">2.0</span>.7\n<span class=\"token punctuation\">[</span>nodemon<span class=\"token punctuation\">]</span> to restart at any time, enter <span class=\"token variable\"><span class=\"token variable\">`</span>rs<span class=\"token variable\">`</span></span>\n<span class=\"token punctuation\">[</span>nodemon<span class=\"token punctuation\">]</span> watching path<span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span>: *.*\n<span class=\"token punctuation\">[</span>nodemon<span class=\"token punctuation\">]</span> watching extensions: js,mjs,json\n<span class=\"token punctuation\">[</span>nodemon<span class=\"token punctuation\">]</span> starting <span class=\"token variable\"><span class=\"token variable\">`</span>node index.js<span class=\"token variable\">`</span></span>\nA API está funcionando<span class=\"token operator\">!</span></code></pre></div>\n<h2 id=\"Modelando-o-dominio\" style=\"position:relative;\">Modelando o domínio<a href=\"#Modelando-o-dominio\" aria-label=\"Modelando o dominio permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Decidi começar pela definição de modelo, porque apesar desse modelo ser simples eu entendo que é sempre bom deixar essa base pronta pois fica mais fácil construir a aplicação em volta de um domínio do que o contrário. Acredito que utilizar outras tecnologias fica mais flexível de mudar do que a mudança no domínio nessa abordagem.</p>\n<p>Então iremos criar uma pasta chamada <em>model</em> e nela a <em>index.js</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> Contact <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n\n    id<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    name<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    telephone<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span>\n\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Contact<span class=\"token punctuation\">)</span></code></pre></div>\n<p>A definição acima é a representação do que seria um contato em uma agenda de contatos composta pelo id, <code class=\"language-text\">(aqui entra um discussão sobre Entidades e VO mas para esse exemplo deixei com um id pois acredito que o modelo em um projeto real não deveria possuir um id provavelmente voltaremos a esse ponto em um artigo futuro)</code> name, telephone e address que são <em>Strings</em> e no <em>exports</em> criamos esse objeto com a função <em>create</em>.</p>\n<h2 id=\"Criando-a-Repository\" style=\"position:relative;\">Criando a Repository<a href=\"#Criando-a-Repository\" aria-label=\"Criando a Repository permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Após ter criado o domínio vamos criar a nossa <strong>Repository</strong> que será responsável por lidar com a persistência de dados. Você pode ter percebido que até o momento não adicionamos nenhuma dependência de persistência então como iremos criar o comportamento responsável por isso?</p>\n<p>Vamos aqui simplificar um pouco as coisas e iremos criar uma persistência em memória e mais a frente vamos entender como podemos deixar tudo bem simples e desacoplado usando a <strong>Injeção de Dependências</strong> e <strong>Inversão de Controle</strong>.</p>\n<p>Vamos criar uma pasta chamada <em>repository</em> e dentro dela o nosso arquivo <em>index.js</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">InMemoryRepository</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">contact</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>contact<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">selectAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">selectById</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">c</span> <span class=\"token operator\">=></span> c<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> contact</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    \n        <span class=\"token keyword\">const</span> elementId <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">.</span><span class=\"token function\">findIndex</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span> <span class=\"token operator\">=></span> element<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        contact<span class=\"token punctuation\">.</span>id <span class=\"token operator\">=</span> id\n    \n        <span class=\"token keyword\">const</span> updateContact <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">[</span>elementId<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> contact<span class=\"token punctuation\">)</span>\n    \n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">[</span>elementId<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> updateContact\n    \n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">[</span>elementId<span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    \n        <span class=\"token keyword\">const</span> index <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">.</span><span class=\"token function\">findIndex</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span> <span class=\"token operator\">=></span> element<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span>\n    \n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_data<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>index<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> InMemoryRepository</code></pre></div>\n<p>Foi usada uma abordagem de classe aqui justamente para depois podermos usar a <strong>Injeção de Dependências</strong>, mas podemos ver também que temos uma variável membro chamada <em>_data</em> que é um array e temos as funções que irão fazer as nossas operações de <strong>CRUD</strong> em cima desse array.</p>\n<p>Após isso exportamos a nossa classe <strong>InMemoryRepository</strong>.</p>\n<h2 id=\"Criando-Services\" style=\"position:relative;\">Criando Services<a href=\"#Criando-Services\" aria-label=\"Criando Services permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora chegou a hora de criar a camada da aplicação que é responsável por executar a lógica de negócios.</p>\n<p>Vamos criar uma pasta chamada <em>service</em> e dentro dela o arquivo <em>index.js</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Service</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">repository</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository <span class=\"token operator\">=</span> repository\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">body</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span>body<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">getById</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">selectById</span><span class=\"token punctuation\">(</span><span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">selectAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> body</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span><span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> body<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> Service</code></pre></div>\n<p>Aqui também usamos a abordagem de classe, mas por que?</p>\n<p>Pois assim é possível injetar a dependência do <em>repository</em> no construtor e com isso o controle é invertido já que a <strong>Service</strong> desconhece qual será a implementação a ser usada, a única coisa que importa para a <strong>Service</strong> é que a <em>repository</em> que será passada deve possuir as funções de <em>insert</em>, <em>selectById</em>, <em>selectAll</em>, <em>update</em> e <em>remove</em>. Não é responsabilidade da <strong>Service</strong> saber se a <em>repository</em> é um banco em memória, MongoDB, Postgres ou qualquer outro meio de persistir dados.</p>\n<p>Caso seja necessário no futuro implementar alguma outra ação ou mude a lógica de negócios, esta alteração deve ser implementada na <strong>Service</strong> e caso necessite de outra dependência deve ser adicionado ou injetado no construtor da classe.</p>\n<h2 id=\"Configurando-Rotas\" style=\"position:relative;\">Configurando Rotas<a href=\"#Configurando-Rotas\" aria-label=\"Configurando Rotas permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos criar as rotas da nossa aplicação, aqui iremos definir quais verbos <strong>HTTP</strong> iremos deixar disponíveis e que iremos direcionar as requisições quando elas chegarem.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> InMemoryRepository <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../repository'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> Service <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../service'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> service <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Service</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">InMemoryRepository</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> contact <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>body\n\n    service<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>contact<span class=\"token punctuation\">)</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">201</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>contact<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/:id'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">getById</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    \n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n    \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n    \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/:id\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id\n    <span class=\"token keyword\">const</span> body <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>body\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> body<span class=\"token punctuation\">)</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/:id\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id\n\n    service<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/health'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>status<span class=\"token operator\">:</span> <span class=\"token string\">\"Ok\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">options</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Access-Control-Allow-Methods'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'GET, POST'</span><span class=\"token punctuation\">)</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Access-Control-Allow-Headers'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Content-Type'</span><span class=\"token punctuation\">)</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> router</code></pre></div>\n<p>Vamos por partes pra entender tudo o que está no código acima:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Router</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> InMemoryRepository <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../repository'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> Service <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../service'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> service <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Service</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">InMemoryRepository</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Nesse trecho importamos do próprio <strong>Express</strong> a dependência do <strong>Router</strong> que irá disponibilizar aqui os verbos <strong>HTTP</strong>, importamos aqui as classes <strong>InMemoryRepository</strong> e <strong>Service</strong> e em seguida instânciamos a <strong>Service</strong> e passamos a dependência de uma <strong>Repository</strong> para ela que nesse caso será a <strong>InMemoryRepository</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">router<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> contact <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>body\n\n    service<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>contact<span class=\"token punctuation\">)</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">201</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>contact<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Aqui usamos o <em>router</em> e chamamos o método <em>post</em> e passamos qual será o <em>path</em> ou caminho que será exposta na <strong>API</strong>, aqui deixamos com <code class=\"language-text\">&#39;/&#39;</code>para indicar que não queremos passar nada na url só de chamar um <strong>POST</strong> ele será atendido por esse método.</p>\n<p>A função <em>post</em> trás consigo o <em>request</em> e o <em>response</em> e com isso podemos extrair algumas informações importantes no <em>request</em> e adicionar dados no <em>response</em>.</p>\n<p>No exemplo acima conseguimos pegar o <em>body</em> que é enviado na requisição e após executar a lógica na <strong>Service</strong> adicionar o <em>status</em> e o <em>body</em> no <em>response</em>.</p>\n<p>Aqui abaixo temos as implementações do <strong>GET</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">router<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/:id'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">getById</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n    \n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n    \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nrouter<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        res<span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token punctuation\">}</span>\n\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">sendStatus</span><span class=\"token punctuation\">(</span><span class=\"token number\">204</span><span class=\"token punctuation\">)</span>\n    \n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>O interessante aqui é entender que no <em>request</em> também conseguimos pegar parâmetros passados na url para isso precisamos de um identificador no <em>path</em> que é passado na função <em>get</em> no caso acima é <code class=\"language-text\">:id</code> a na função pegamos o valor através da sintaxe <code class=\"language-text\">req.params.id</code>.</p>\n<p>A lógica nas requisições <strong>GET</strong>  é que caso não encontre dados na consulta retorne o status <em>204 - No Content</em> e caso encontre retorna <em>200 - Ok</em> com os dados solicitados.</p>\n<p>Os métodos para <strong>PUT</strong> e <strong>DELETE</strong> seguem a mesma lógica.</p>\n<h2 id=\"Configurando-o-Express-e-middlewares\" style=\"position:relative;\">Configurando o Express e middlewares<a href=\"#Configurando-o-Express-e-middlewares\" aria-label=\"Configurando o Express e middlewares permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Temos a <strong>Service</strong> e as <strong>Rotas</strong> configuradas e agora é necessário adicionar o módulo de rotas ao <strong>Express</strong> para que ele consiga utilizar e assim ficar disponível para ser usado.</p>\n<p>No arquivo <em>index.js</em> na raiz do projeto já existe uma configuração:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> bodyParser <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'body-parser'</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">urlencoded</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> extended<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> resp<span class=\"token punctuation\">,</span> next</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    resp<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Access-Control-Allow-Origin'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'*'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> server <span class=\"token operator\">=</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'A API está funcionando!'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> server</code></pre></div>\n<p>Com essa configuração já estamos usando os <em>middlewares</em>, onde adicionamos as funções que queremos complementar ao <strong>Express</strong>, acima estamos usando a <em>lib</em> <strong>body-parser</strong> para ajudar com o parse da resposta e outro <em>middleware</em> para tratativa de <strong>CORS</strong> e vamos adicionar o nosso módulo de rotas:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> bodyParser <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'body-parser'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./router'</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">urlencoded</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> extended<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> resp<span class=\"token punctuation\">,</span> next</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    resp<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Access-Control-Allow-Origin'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'*'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api'</span><span class=\"token punctuation\">,</span> router<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> server <span class=\"token operator\">=</span> app<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'A API está funcionando!'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> server</code></pre></div>\n<p>Acima foi importado o módulo <em>router</em> e adicionado no <strong>Express</strong> através da função <em>use</em> onde definimos o <em>path</em> raiz da nossa <strong>API</strong> e no segundo argumento o módulo <em>router</em>.</p>\n<h2 id=\"Iniciando-a-aplicacao\" style=\"position:relative;\">Iniciando a aplicação<a href=\"#Iniciando-a-aplicacao\" aria-label=\"Iniciando a aplicacao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Podemos iniciar a aplicação dessa forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">nodemon index.js</code></pre></div>\n<p>E fazendo um <strong>POST</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> --location --request POST <span class=\"token string\">'http://localhost:3000/api'</span> <span class=\"token punctuation\">\\</span>\n--header <span class=\"token string\">'Content-Type: application/json'</span> <span class=\"token punctuation\">\\</span>\n--data-raw <span class=\"token string\">'{\n\n    \"id\": 1,\n    \"name\": \"Kelly\",\n    \"telephone\": \"118888888\",\n    \"address\": \"Rua dos Bobos n 1\"\n\n}'</span> <span class=\"token operator\">|</span> json_pp</code></pre></div>\n<p>Teremos a seguinte resposta:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n   <span class=\"token property\">\"id\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Kelly\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">\"address\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Rua dos Bobos n 1\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">\"telephone\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"118888888\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Testes\" style=\"position:relative;\">Testes<a href=\"#Testes\" aria-label=\"Testes permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>No começo do artigo adicionamos as dependências do <em>jest</em> e <em>supertest</em> e agora vamos implementar um teste.</p>\n<p>Na pasta <em>router</em> vamos criar o arquivo <em>router.test.js</em>, seguindo a convenção de nomenclatura do <em>jest</em> para que ele saiba quais arquivos devem ser testados.</p>\n<p>Dentro do arquivo vamos criar a nossa primeira suite de testes para testar a rota de <strong>POST</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> supertest <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'supertest'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> server <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../index'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">afterAll</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  server<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Make requests to the server'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should create a contact'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> resp <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">supertest</span><span class=\"token punctuation\">(</span>server<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Kelly\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"telephone\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"118888888\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"address\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Rua dos Bobos n 1\"</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>resp<span class=\"token punctuation\">.</span>statusCode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">201</span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>resp<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Kelly\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Aqui importamos a <em>lib</em> do <strong>supertest</strong> e o arquivo <em>index.js</em> da raíz do projeto, primeiramente adicionamos uma função chamada <em>afterAll</em> para que após o testes serem rodados a aplicação seja terminada.</p>\n<p>Criamos a suite de testes com a função <em>describe</em> e dentro dela colocamos os testes necessários para testar aquela suite com a função <em>it</em>.</p>\n<p>Para fazer o mock da requisição usamos o <em>supertest</em> a passamos para ele o nosso <em>server</em>, invocamos a função <strong>HTTP</strong> que queremos testar passando o <em>path</em> e com a função <em>send</em> passamos o <em>json</em> que será enviado.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> resp <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">supertest</span><span class=\"token punctuation\">(</span>server<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Kelly\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"telephone\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"118888888\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"address\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Rua dos Bobos n 1\"</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Com o retorno do <em>response</em> conseguimos fazer as asserções dos testes, nesse caso queremos testar que a cada <strong>POST</strong> bem sucedido iremos retornar o status code <em>201 - Created</em> e o <em>body</em> será devolvido então podemos fazer a asserção de algum campo do response.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>resp<span class=\"token punctuation\">.</span>statusCode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">201</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>resp<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Kelly\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Agora conseguimos rodar o comando a seguir para rodar esse teste:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">jest --coverage</code></pre></div>\n<p>E teremos a seguinte resposta:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">></span> jest --coverage --runInBand\n\n PASS  router/route.test.js\n  Make requests to the server\n    ✓ Should create a contact <span class=\"token punctuation\">(</span><span class=\"token number\">65</span> ms<span class=\"token punctuation\">)</span>\n\n  console.log\n    A API está funcionando<span class=\"token operator\">!</span>\n\n      at Server.<span class=\"token operator\">&lt;</span>anonymous<span class=\"token operator\">></span> <span class=\"token punctuation\">(</span>index.js:16:47<span class=\"token punctuation\">)</span>\n\n----------------------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------------------------------\nFile                  <span class=\"token operator\">|</span> % Stmts <span class=\"token operator\">|</span> % Branch <span class=\"token operator\">|</span> % Funcs <span class=\"token operator\">|</span> % Lines <span class=\"token operator\">|</span> Uncovered Line <span class=\"token comment\">#s                </span>\n----------------------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------------------------------\nAll files             <span class=\"token operator\">|</span>   <span class=\"token number\">48.68</span> <span class=\"token operator\">|</span>        <span class=\"token number\">0</span> <span class=\"token operator\">|</span>   <span class=\"token number\">29.17</span> <span class=\"token operator\">|</span>      <span class=\"token number\">50</span> <span class=\"token operator\">|</span>                                  \n phonebook            <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>                                  \n  index.js            <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>                                  \n phonebook/model      <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>                                  \n  index.js            <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>     <span class=\"token number\">100</span> <span class=\"token operator\">|</span>                                  \n phonebook/repository <span class=\"token operator\">|</span>      <span class=\"token number\">20</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>   <span class=\"token number\">22.22</span> <span class=\"token operator\">|</span>      <span class=\"token number\">25</span> <span class=\"token operator\">|</span>                                  \n  index.js            <span class=\"token operator\">|</span>      <span class=\"token number\">20</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>   <span class=\"token number\">22.22</span> <span class=\"token operator\">|</span>      <span class=\"token number\">25</span> <span class=\"token operator\">|</span> <span class=\"token number\">12</span>-35                            \n phonebook/router     <span class=\"token operator\">|</span>   <span class=\"token number\">39.47</span> <span class=\"token operator\">|</span>        <span class=\"token number\">0</span> <span class=\"token operator\">|</span>   <span class=\"token number\">14.29</span> <span class=\"token operator\">|</span>   <span class=\"token number\">39.47</span> <span class=\"token operator\">|</span>                                  \n  index.js            <span class=\"token operator\">|</span>   <span class=\"token number\">39.47</span> <span class=\"token operator\">|</span>        <span class=\"token number\">0</span> <span class=\"token operator\">|</span>   <span class=\"token number\">14.29</span> <span class=\"token operator\">|</span>   <span class=\"token number\">39.47</span> <span class=\"token operator\">|</span> <span class=\"token number\">16</span>-24,30-37,43-48,53-57,62,66-69 \n phonebook/service    <span class=\"token operator\">|</span>      <span class=\"token number\">50</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>   <span class=\"token number\">33.33</span> <span class=\"token operator\">|</span>      <span class=\"token number\">50</span> <span class=\"token operator\">|</span>                                  \n  index.js            <span class=\"token operator\">|</span>      <span class=\"token number\">50</span> <span class=\"token operator\">|</span>      <span class=\"token number\">100</span> <span class=\"token operator\">|</span>   <span class=\"token number\">33.33</span> <span class=\"token operator\">|</span>      <span class=\"token number\">50</span> <span class=\"token operator\">|</span> <span class=\"token number\">14</span>-26                            \n----------------------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>---------<span class=\"token operator\">|</span>----------------------------------\nTest Suites: <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">2.015</span> s\nRan all <span class=\"token builtin class-name\">test</span> suites.</code></pre></div>\n<p>Além do teste passamos o parâmetro <code class=\"language-text\">--coverage</code> e com isso é gerado um <em>html</em> com um relatório da cobertura dos testes.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 21.47239263803681%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA2klEQVQY012LW26CUBRFmf8c+usobNIJNKZAKVZosedeXvIQuPJo1FWKfvmxstfJ3sfKVUx/bBmajr655dgaJtNzGX/vTFwf/Hr3y4NbjQidFhr5oVVCLdFCI/vl7tOEPkvolMJozZBmc8a0WjFkKackxsT6tpuxwvwLqbaUJiCtPF5eV6zdFXb0TNkG6MIlKT1U5RAbh329QdU2efMxd86tn//i4n3BkjAkC33O6Y7x2+awfuIkGwb9yTnZ0kUOfeRSK5ei8NH6jVJ8pkg4+jtMEDKIh5l3//wB7topo40tYg0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"jest coverage\"\n        title=\"jest coverage\"\n        data-src=\"/static/f9b5c6dafc2e6c7dfb34924d3315ed56/a6d36/jest-coverage.png\"\n        data-srcset=\"/static/f9b5c6dafc2e6c7dfb34924d3315ed56/222b7/jest-coverage.png 163w,\n/static/f9b5c6dafc2e6c7dfb34924d3315ed56/ff46a/jest-coverage.png 325w,\n/static/f9b5c6dafc2e6c7dfb34924d3315ed56/a6d36/jest-coverage.png 650w,\n/static/f9b5c6dafc2e6c7dfb34924d3315ed56/e548f/jest-coverage.png 975w,\n/static/f9b5c6dafc2e6c7dfb34924d3315ed56/3c492/jest-coverage.png 1300w,\n/static/f9b5c6dafc2e6c7dfb34924d3315ed56/ec2ae/jest-coverage.png 3572w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Nesse artigo iniciamos a construção de uma <strong>API REST</strong> do zero usando <strong>NodeJS</strong> e <strong>Express</strong>. Vimos a facilidade de usar o <strong>Express</strong> e como o mecanismo de <em>middleware</em> torna o desenvolvimento flexível e dinâmico. Também conseguimos ver como deixar uma aplicação desacoplada utilizando o conceito de <strong>Injeção de dependências</strong></p>\n<h2 id=\"Codigo-fonte-e-recursos\" style=\"position:relative;\">Código fonte e recursos<a href=\"#Codigo-fonte-e-recursos\" aria-label=\"Codigo fonte e recursos permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Segue o <a href=\"https://github.com/guilhermegarcia86/phonebook\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a> do projeto e a <a href=\"https://www.getpostman.com/collections/29fb2440b862ccfcec2a\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Collection</a> do <strong>Postman</strong></p>","fields":{"slug":"/express-rest-I/"},"frontmatter":{"date":"06 de abril de 2021","description":"Construindo uma API REST do zero","title":"NodeJS e Express","tags":["JavaScript","NodeJS","Express","Rest"],"author":"Guilherme Alves","image":{"id":"020bc564-ea81-5133-85b4-23d052c359ac","publicURL":"/static/9ff3232ef2ea482c1931b79f40243cf0/capa-node-express-rest.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABSElEQVQoz52TS0+DUBCF+a/+DBcu3GmiC41x05U746a69pVYm0KwKVCCicU+5E0RAiFCW47cwZpaY2K5yWQGmDn5LvdcrigKsMXyophTrL5b1v9dXDW4+PWBCdcR5VbFnr0r9MwzfMyiH2KbBBEG6QDt0SEmYRtOrKAzPsL4vVWJosaWhckp7LiH1+COCPXgBo+jAySZQ02macB1XURRVNYm1ZZlwTAM2LYNz/MoEyHbct+5KCl1NNUt3Ou7aA33Ib41kOQWZlkBnuchiiJlVVXR7XahKAoEQYAsy5AkiXKaphXhk9EoCSVcv2xT3Rkf42G4hziziND3faKbTqfQNA1hGNIwew6CgIgdx0Ge55Ug+3e3gx1o7iWRMkHFPt/YMl+nXA3l87QUbIKfnMBN+t8NtU556bl1H64afN2Tf9Fz681VLGrflE+hSEwr/iXzcgAAAABJRU5ErkJggg==","aspectRatio":1.7777777777777777,"src":"/static/9ff3232ef2ea482c1931b79f40243cf0/0823f/capa-node-express-rest.png","srcSet":"/static/9ff3232ef2ea482c1931b79f40243cf0/c67b7/capa-node-express-rest.png 320w,\n/static/9ff3232ef2ea482c1931b79f40243cf0/d3930/capa-node-express-rest.png 640w,\n/static/9ff3232ef2ea482c1931b79f40243cf0/0823f/capa-node-express-rest.png 1280w,\n/static/9ff3232ef2ea482c1931b79f40243cf0/c730b/capa-node-express-rest.png 1920w,\n/static/9ff3232ef2ea482c1931b79f40243cf0/55bfe/capa-node-express-rest.png 2240w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":12}},"pageContext":{"slug":"/express-rest-I/","previous":{"fields":{"slug":"/kafka-sink/"},"frontmatter":{"title":"Kafka Sink","date":"02 mar, 2021"}},"next":{"fields":{"slug":"/express-rest-db/"},"frontmatter":{"title":"Express e MongoDB","date":"19 abr, 2021"}}}},"staticQueryHashes":["63159454"]}