{"id":8222,"date":"2020-02-28T16:03:45","date_gmt":"2020-02-29T00:03:45","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8222"},"modified":"2025-06-13T21:03:55","modified_gmt":"2025-06-14T04:03:55","slug":"fullstack-react-apollo-3","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/fullstack-react-apollo-3\/","title":{"rendered":"Fullstack React e GraphQL: Cliente Apollo"},"content":{"rendered":"<p>O terceiro de tr\u00eas artigos focados na cria\u00e7\u00e3o de React Fullstack e GraphQL com o Apollo GraphQL Client.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/fullstack-react-couchbase-1\/\">Configura\u00e7\u00e3o de um servidor NoSQL Couchbase (Parte 1)<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/fullstack-react-express-2\/\">Cria\u00e7\u00e3o de uma API Express-GraphQL (Parte 2)<\/a><\/li>\n<li>Criar um cliente Apollo GraphQL em React (Parte 3)<\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/rage-with-couchbase-final\">C\u00f3digo-fonte final<\/a><\/li>\n<\/ul>\n<h2 id=\"creating-the-react-app\">Cria\u00e7\u00e3o do aplicativo React com um cliente Apollo GraphQL<\/h2>\n<p>Neste segmento do tutorial, eu o ajudarei a conectar as partes relacionadas ao uso do Apollo GraphQL. Inclu\u00ed a maior parte do aplicativo React de que voc\u00ea precisar\u00e1 em um reposit\u00f3rio do GitHub. Esse c\u00f3digo predefinido que clonamos em nosso projeto ser\u00e1 um projeto React que foi criado com o Create Rect App e tem roteamento, navega\u00e7\u00e3o, menus, comportamento responsivo, estado e contexto sendo gerenciados, bem como alguns utilit\u00e1rios e outros componentes para dar suporte a uma arquitetura b\u00e1sica de aplicativo. Eu queria ter certeza de que s\u00f3 precisar\u00edamos nos preocupar com a configura\u00e7\u00e3o do cliente Apollo GraphQL, mas queria fazer isso no contexto de um aplicativo em funcionamento.<\/p>\n<h3 id=\"clone-existing-react-app\">Clonar um aplicativo React existente<\/h3>\n<p>Nosso front-end React desacoplado ser\u00e1 um irm\u00e3o do <code>servidor couchbase-gql<\/code> Aqui est\u00e1 uma ideia b\u00e1sica de como ser\u00e1 a nossa estrutura de diret\u00f3rios:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false striped:false nums:false lang:sh decode:true\" title=\"Estrutura do diret\u00f3rio\">  \r\n  raiva com base de toque\r\n  \u2502\r\n  \u2514\u2500\u2500\u2500couchbase-gql-server\r\n  \u2502\r\n  \u2514\u2500\u2500\u2500react-apollo-client\r\n<\/pre>\n<p>Vamos clonar o ponto de partida do nosso projeto React executando o seguinte comando git a partir da raiz (<code>raiva com base de toque<\/code> ) em nosso terminal:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Clonar reposit\u00f3rio e remover detalhes do Git\">git clone https:\/\/github.com\/httpJunkie\/react-apollo-client.git &amp;&amp; cd react-apollo-client &amp;&amp; rm -rf .git<\/pre>\n<p>In the command above, we removed the `.git` directory as we do not want to take on the existing git history from the project we cloned into our project. You will need to initialize git on your own and periodically commit if you want to. It&#8217;s encouraged so that you don&#8217;t lose your work.<\/p>\n<p>Agora temos um aplicativo React em funcionamento adicionado ao nosso projeto com roteamento b\u00e1sico. H\u00e1 alguns componentes e utilit\u00e1rios que existem no projeto React, mas ainda n\u00e3o est\u00e3o conectados. Antes de chegarmos a eles, vamos executar o aplicativo React por conta pr\u00f3pria para garantir que tudo esteja funcionando sem erros:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Instala\u00e7\u00e3o e in\u00edcio do NPM\">npm install &amp;&amp; npm start<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/02\/react-starting-point-layout.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-8230\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/02\/react-starting-point-layout.jpg\" alt=\"preview of our React starting point\" width=\"1020\" height=\"713\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/react-starting-point-layout.jpg 1020w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/react-starting-point-layout-300x210.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/react-starting-point-layout-768x537.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/react-starting-point-layout-20x14.jpg 20w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/a><\/p>\n<p>Abra o console (<strong>\u2318 Cmd + \u2325 Option + I<\/strong> no Mac) (<strong>Ctrl + \u2191 Shift + J<\/strong> no PC)<\/p>\n<p>Certifique-se de que clicar para frente e para tr\u00e1s de Home para Airlines n\u00e3o gere nenhum erro e que n\u00e3o haja erros ou avisos importantes. O que vemos nesta visualiza\u00e7\u00e3o \u00e9 a rota Airlines, que \u00e9 a rota \u00e0 qual adicionaremos nosso recurso de detalhes mestre. \u00c9 como se outra pessoa j\u00e1 tivesse se encarregado de todo o estilo e do layout b\u00e1sico, nosso trabalho ser\u00e1 conectar o <code>lista de companhias a\u00e9reas.jsx<\/code> e <code>detalhes da companhia a\u00e9rea.jsx<\/code> no lugar do texto atual do espa\u00e7o reservado em cada lado da p\u00e1gina. Felizmente, nossa equipe de design garantiu que todo o trabalho de layout e CSS estivesse completo!<\/p>\n<p>Antes de fazermos altera\u00e7\u00f5es no aplicativo React, vamos entender alguns dos arquivos que temos em nosso projeto e que ainda n\u00e3o est\u00e3o em jogo com nossa rota Airline.<\/p>\n<h3 id=\"overview-of-assets\">Vis\u00e3o geral de nossos ativos<\/h3>\n<p>H\u00e1 seis arquivos com os quais queremos nos familiarizar e que est\u00e3o aguardando para serem usados.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/hoc\/withApolloProvider.js\">hoc\/withApolloProvider.js<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-list.jsx\">partial\/airline-list.jsx<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-details.jsx\">partial\/airline-details.jsx<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/utility\/pagination.jsx\">utility\/pagination.jsx<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/utility\/pagination.scss\">utility\/pagination.scss<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/routes\/airline-gql.js\">routes\/airline-gql.js<\/a><\/li>\n<\/ul>\n<p>Uma conven\u00e7\u00e3o que estamos usando em rela\u00e7\u00e3o \u00e0 estrutura de diret\u00f3rios \u00e9 que os componentes no diret\u00f3rio \"<code>rotas<\/code>\" s\u00e3o componentes do React que s\u00e3o resolvidos para formar uma rota espec\u00edfica e esses arquivos dentro do diret\u00f3rio \"<code>parcial<\/code>\" s\u00e3o componentes que n\u00e3o s\u00e3o uma visualiza\u00e7\u00e3o carregada por uma rota, mas sim uma visualiza\u00e7\u00e3o parcial ou um componente que pode ser potencialmente reutilizado em nosso aplicativo. Essa \u00e9 uma conven\u00e7\u00e3o que eu uso, e n\u00e3o algo que o React nos obriga a fazer.<\/p>\n<p><strong>comApolloProvider<\/strong> - Estou usando um componente de ordem superior para facilitar a leitura. Entenda que isso \u00e9 semelhante a importar o ApolloProvider em um componente pai. Essa pode n\u00e3o ser a melhor pr\u00e1tica, mas gosto do fato de manter meu c\u00f3digo organizado.<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:default decode:true\" title=\"Componente de ordem superior WithApolloProvider\">importar React de 'react'\r\nimportar { ApolloProvider, InMemoryCache, ApolloClient } de '@apollo\/client';\r\n\r\nconst withApolloProvider = (WrappedComponent, graphqlEndpoint) =&gt; {\r\n  const apolloClient = new ApolloClient({\r\n    uri: graphqlEndpoint,\r\n    cache: new InMemoryCache()\r\n  })\r\n\r\n  return (props) =&gt; (\r\n    \r\n      \r\n    \r\n  )\r\n}\r\n\r\nexport default withApolloProvider<\/pre>\n<p>Temos <a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-list.jsx\"><code>lista de companhias a\u00e9reas.jsx<\/code><\/a> e um <a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-details.jsx\"><code>detalhes da companhia a\u00e9rea.jsx<\/code><\/a>esses dois componentes ser\u00e3o carregados lado a lado em nosso <code>companhias a\u00e9reas.jsx<\/code> componente. A lista simplesmente exibir\u00e1 cada companhia a\u00e9rea e usar\u00e1 <a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/utility\/pagination.jsx\"><code>pagina\u00e7\u00e3o.jsx<\/code><\/a> para garantir que n\u00e3o tenhamos uma longa lista no lado esquerdo da p\u00e1gina.<\/p>\n<p>Por fim, temos o <code>companhia a\u00e9rea-gql.js<\/code> que \u00e9 simplesmente nosso arquivo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consulta GraphQL<\/a> para todas as companhias a\u00e9reas do Reino Unido. Eu gosto de separar minhas consultas em outro arquivo para fins de organiza\u00e7\u00e3o, n\u00e3o \u00e9 necess\u00e1rio, mas limpa o <code>companhias a\u00e9reas.jsx<\/code> arquivo.<\/p>\n<h3 id=\"how-our-master-detail-page-works\">Como funciona nossa p\u00e1gina mestre-detalhe<\/h3>\n<p>Em nosso projeto, temos uma rela\u00e7\u00e3o de componente mestre-detalhe (<code>lista de companhias a\u00e9reas.jsx<\/code> &amp;&amp; <code>detalhes da companhia a\u00e9rea.jsx<\/code>), no <code>\/companhias a\u00e9reas<\/code> rota. Essa rota \u00e9 resolvida para um componente de visualiza\u00e7\u00e3o chamado: <code>companhias a\u00e9reas.jsx<\/code>que utiliza os recursos do React Router para corresponder n\u00e3o apenas \u00e0 rota, mas tamb\u00e9m a um par\u00e2metro URI adicional (<code>companhia a\u00e9reaId<\/code>) que podemos anexar ao final da rota para sermos espec\u00edficos. Quando nenhuma rota espec\u00edfica <code>companhia a\u00e9reaId<\/code> O par\u00e2metro URI est\u00e1 presente no URL:<\/p>\n<p><code>https:\/\/localhost:3000\/airlines<\/code><\/p>\n<p>Ele exibir\u00e1 apenas uma lista de companhias a\u00e9reas no lado esquerdo. Al\u00e9m disso, ser\u00e1 exibido um link no lado direito da p\u00e1gina com os seguintes dizeres: <strong>\"Selecione uma companhia a\u00e9rea\"<\/strong>.<\/p>\n<p>A sele\u00e7\u00e3o de uma companhia a\u00e9rea no menu carregar\u00e1 os detalhes no lado direito da p\u00e1gina. Depois de clicado, atualizaremos o URL com o ID adequado usando um componente  fornecido pelo React Router:<\/p>\n<p><code>https:\/\/localhost:3000\/airlines\/1355<\/code><\/p>\n<p>Aqui, faremos a correspond\u00eancia com o ID <code>1355<\/code> com a companhia a\u00e9rea correta j\u00e1 na mem\u00f3ria em nossos dados do aplicativo React e exibir as informa\u00e7\u00f5es apropriadas da companhia a\u00e9rea \"British Airways\".<\/p>\n<h3 id=\"adding-dependencies-for-our-apollo-graphql-client\">Adi\u00e7\u00e3o de depend\u00eancias para nosso cliente Apollo GraphQL<\/h3>\n<p>Precisamos de tr\u00eas pacotes: <a href=\"https:\/\/www.npmjs.com\/package\/@apollo\/react-hooks\"><code>@apollo\/react-hooks<\/code><\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/apollo-boost\"><code>apollo-boost<\/code><\/a>e <a href=\"https:\/\/www.npmjs.com\/package\/graphql\"><code>graphql<\/code><\/a>, trazidos para o projeto, ent\u00e3o vamos <code>cd<\/code> no <code>cliente react-apollo<\/code> e execute o comando <code> npm install <\/code> para os pacotes necess\u00e1rios para o GraphQL e o Apollo:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Instalar o cliente Apollo 3 e o GraphQL\">npm install @apollo\/client graphql<\/pre>\n<p>Se voc\u00ea quiser se familiarizar com o Apollo e o GraphQL, o <a href=\"https:\/\/www.apollographql.com\/docs\/react\/data\/queries\/\">Documenta\u00e7\u00e3o do GraphQL para consultas<\/a>O site da empresa, que \u00e9 um lugar ideal para come\u00e7ar, tamb\u00e9m pode ser visto: <a href=\"https:\/\/www.apollographql.com\/docs\/react\/data\/queries\/#executing-a-query\">Documenta\u00e7\u00e3o do GraphQL sobre como fazer consultas<\/a> no Apollo e no React.<\/p>\n<h3 id=\"building-the-master-detail-page\">Cria\u00e7\u00e3o da p\u00e1gina mestre-detalhe<\/h3>\n<p>The `airlines.jsx` file is where we will be doing most of our work. Let&#8217;s start by adding some imports:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:javascript decode:true\" title=\"Importa\u00e7\u00f5es para o componente de companhias a\u00e9reas\">import { useQuery } from '@apollo\/client'\r\nimport { airlineGql } from '.\/airline-gql'<\/pre>\n<p>Underneath the `import { airlineGql }` line, we need to import <code>comApolloProvider<\/code>um componente de ordem superior.<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:javascript decode:true\" title=\"Importar HOC do provedor do Apollo\">importar withApolloProvider de '..\/hoc\/withApolloProvider'<\/pre>\n<p>Isso envolve nosso componente com um provedor Apollo. Usei esse m\u00e9todo em vez de envolver todo o nosso aplicativo com um ApolloProvider. Uma tentativa de tornar o c\u00f3digo que estou compartilhando um pouco menos complexo. Atualizaremos o <code>companhias a\u00e9reas.jsx<\/code> exporta\u00e7\u00e3o do arquivo.<\/p>\n<p>A linha que diz:<\/p>\n<p><strong><code>exportar linhas a\u00e9reas padr\u00e3o<\/code><\/strong><\/p>\n<p>deve ser alterado para:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:javascript decode:true\" title=\"Atualizar a exporta\u00e7\u00e3o do componente da companhia a\u00e9rea com o componente envolvido\">const WrappedComponent = withApolloProvider(Airlines, 'https:\/\/localhost:4000\/graphql')\r\nexport default WrappedComponent<\/pre>\n<p>Our first argument to the HOC is a React Component `Airlines` (this component). Therefore, when our app is rendered, the <code>&lt;Airlines \/&gt;<\/code> ser\u00e1 envolvido por nosso componente <a href=\"https:\/\/www.apollographql.com\/docs\/react\/get-started\/#connect-your-client-to-react\">ApolloProvider<\/a>. Um provedor no React \u00e9 uma fun\u00e7\u00e3o da API Context. O Context fornece dados em toda a \u00e1rvore de componentes em nosso aplicativo React sem precisar passar os dados manualmente por meio de props. No nosso caso, o <code>&lt;Airlines \/&gt;<\/code> ser\u00e1 envolvido pelo nosso provedor, dando a ele acesso aos dados fornecidos pelo c\u00f3digo do cliente Apollo definido nesse componente <code>comApolloProvider<\/code> componente de ordem superior.<\/p>\n<p>Nossas importa\u00e7\u00f5es finais s\u00e3o os dois componentes que j\u00e1 criei para voc\u00ea (<a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-list.jsx\">lista de companhias a\u00e9reas.jsx<\/a> e <a href=\"https:\/\/github.com\/httpJunkie\/react-apollo-client\/blob\/master\/src\/components\/partial\/airline-details.jsx\">detalhes da companhia a\u00e9rea.jsx<\/a>):<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:javascript decode:true\" title=\"Import AirlineList &amp; AirlineDetails Components\">importar AirlineList de '..\/partial\/airline-list'\r\nimport AirlineDetails from '..\/partial\/airline-details'<\/pre>\n<p>Quando esses dois arquivos forem importados, poderemos adicionar a sintaxe de seus componentes \u00e0 nossa grade flexbox (<a href=\"https:\/\/www.npmjs.com\/package\/simple-flexbox\">simple-flexbox<\/a> que criamos para nos ajudar a dividir facilmente nossa p\u00e1gina por uma porcentagem:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:jsx decode:true\" title=\"Tela dividida Flexbox\"><\/pre>\n<p>Com tudo isso pronto, s\u00f3 precisamos lidar com nossos dados. <code>useQuery<\/code> retorna um objeto do cliente Apollo GraphQL com <code>carregamento<\/code>, <code>erro<\/code>e <code>dados<\/code> que podemos usar. Tamb\u00e9m precisamos combinar o caminho da nossa rota (a partir do URL). O acesso a isso \u00e9 f\u00e1cil com o React Router: (<code>match.params<\/code>).<\/p>\n<p>Let&#8217;s bring React Router&#8217;s `match` in by destructuring the props to the `Airlines` Component::<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:javascript decode:true\" title=\"Correspond\u00eancia destrutiva dos dados do provedor do React Router\">const Airlines = ({ match }) =&gt; {<\/pre>\n<p>Em seguida, adicionaremos o seguinte ao n\u00edvel superior do nosso <code>Companhias a\u00e9reas<\/code> Componente:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:javascript decode:true\" title=\"Carregar dados da companhia a\u00e9rea e fazer a correspond\u00eancia com a companhia a\u00e9rea selecionada\">const airlineId = Number(match.params.id)\r\n  const { loading, error, data } = useQuery(airlineGql)\r\n\r\n  se (loading) return &lt;p&gt;Carregando...&lt;\/p&gt;\r\n  Se (erro) retornar &lt;p&gt;Erro :( &lt;span style=&quot;{{color:&quot; &#039;red&#039;}}&gt;{error.message}&lt;\/span&gt; )&lt;\/p&gt;\r\n\r\n  const airlines = data.airlinesUK\r\n  const airline = match.params.id ? airlines.find(a =&amp;gt; a.id === airlineId) : null<\/pre>\n<p><strong>O que acabamos de fazer:<\/strong><\/p>\n<ol>\n<li>Conjunto <code>companhia a\u00e9reaId<\/code> se o <code>match.params.id<\/code> retorna um n\u00famero e n\u00e3o <code>indefinido<\/code> (temos uma ID em nosso caminho de rota? <code>\/companhias a\u00e9reas\/1355<\/code> ou n\u00e3o <code>\/companhias a\u00e9reas\/<\/code>?).<\/li>\n<li>Usando a string de consulta GraphQL exportada em nosso <code>companhia a\u00e9reaGql<\/code> file. Lembre-se de que ele retorna coisas, portanto, estamos desestruturando-as aqui tamb\u00e9m.<\/li>\n<li>Retornar \"loading\" at\u00e9 que os dados tenham sido carregados<\/li>\n<li>Retornar \"Error\" caso nosso servidor GraphQL n\u00e3o esteja em execu\u00e7\u00e3o ou tenha um erro, etc...<\/li>\n<li>Capture os dados de todas as companhias a\u00e9reas retornadas de nossa consulta em uma vari\u00e1vel local chamada <code>companhias a\u00e9reas<\/code><\/li>\n<li>Se <code>match.params.id<\/code> cont\u00e9m um n\u00famero, significa que nossa rota cont\u00e9m uma ID. Nesse caso, capturamos os dados dessa companhia a\u00e9rea espec\u00edfica em uma vari\u00e1vel local chamada <code>companhia a\u00e9rea<\/code> caso contr\u00e1rio, armazenamos um valor nulo nessa vari\u00e1vel.<\/li>\n<\/ol>\n<p>O <code>partida<\/code> funcionar\u00e1 devido \u00e0 maneira como configuramos nossa rota no <code>App.js<\/code> p\u00e1gina:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:jsx decode:true\" title=\"Atualizar a defini\u00e7\u00e3o do React Router\">}\r\n\/&gt;<\/pre>\n<p>Essa rota, de fato, diz: Procure uma rota com o nome <code>\/companhias a\u00e9reas\/<\/code> e qualquer coisa depois disso estar\u00e1 dispon\u00edvel usando o <code>match.params.id<\/code> sintaxe.<\/p>\n<p>Se executarmos nosso projeto agora e o servidor GraphQL n\u00e3o estiver em execu\u00e7\u00e3o, receberemos um erro.<br \/>\n\"Error :( Network error: Failed to fetch )\"<\/p>\n<p>Portanto, precisamos iniciar esse servidor antes de executar nosso aplicativo React para testar nossa p\u00e1gina master-detail.<\/p>\n<h3 id=\"running-our-app\">Executando nosso aplicativo Full Stack<\/h3>\n<p>Para executar nosso projeto fullstack React e GraphQL, precisaremos primeiro adicionar mais um pacote:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Instalar o pacote CORS\">npm install cors<\/pre>\n<p>Nosso aplicativo est\u00e1 hospedado em um dom\u00ednio (localhost:3000). Ele faz solicita\u00e7\u00f5es a uma API em outro dom\u00ednio (localhost:4000). Sem o CORS, a pol\u00edtica de mesma origem do navegador bloquear\u00e1 a solicita\u00e7\u00e3o.<\/p>\n<p>O CORS permite que nossa API informe ao navegador que n\u00e3o h\u00e1 problema em nosso aplicativo Web fazer solicita\u00e7\u00f5es a ela. Ele faz isso enviando cabe\u00e7alhos HTTP. Precisamos usar o CORS em nosso servidor Express-GraphQL. Basta adicionar o c\u00f3digo a seguir para substituir as sete primeiras linhas existentes.<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:javascript decode:true\" title=\"Adicionar suporte a CORS ao aplicativo Express\">const express = require('express')\r\nconst cors = require('cors')\r\nconst graphqlHTTP = require('express-graphql')\r\nconst { buildSchema } = require('graphql')\r\n  \r\nconst couchbase = require('couchbase')\r\n  \r\nconst app = express()\r\napp.use(cors())<\/pre>\n<p>Para se familiarizar com o CORS da frente para tr\u00e1s, confira um artigo intitulado: \"<a href=\"https:\/\/www.prisma.io\/blog\/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d\">Como ativar o CORS para o Express-GraphQL e o Apollo Server<\/a>&#8221;<\/p>\n<p>Neste ponto, s\u00f3 precisamos garantir que nossa inst\u00e2ncia do Couchbase Server esteja funcionando.<\/p>\n<p>No diret\u00f3rio do servidor, execute o comando node para iniciar o servidor Express-GraphQL:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:jsx decode:true\" title=\"Executar servidor\">servidor de n\u00f3s<\/pre>\n<p>Em seguida, no diret\u00f3rio do cliente, vamos executar o comando para iniciar nosso cliente React:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Iniciar o Express Server\">npm start<\/pre>\n<p>O aplicativo React se conecta \u00e0 API Express-GraphQL, que, por sua vez, consulta o banco de dados Couchbase para recuperar os dados da companhia a\u00e9rea, e agora devemos ter um aplicativo funcional se o visitarmos: <a href=\"https:\/\/localhost:3000\/\">localhost:3000<\/a><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/02\/final-project.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-8232\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/02\/final-project.gif\" alt=\"Final preview of React fullstack application\" width=\"1022\" height=\"840\" \/><\/a><\/p>\n<h2 id=\"using-postinstall-and-concurrently\">Usando Postinstall e Concurrently<\/h2>\n<p>Agora que tudo est\u00e1 funcionando, vamos atualizar o projeto para executar ambos os projetos com um \u00fanico comando npm.<\/p>\n<p>We need to initialize an npm project in our root directory. The server and client both have their own project directories. We give the root directory its own `package.json` file with only one dependency.<\/p>\n<p>Altere os diret\u00f3rios para a raiz e execute:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Inicializar a raiz como projeto NPM e instalar simultaneamente\">npm init -y &amp;&amp; npm install concurrently --save-dev<\/pre>\n<p>Isso inicializar\u00e1 o npm e aceitar\u00e1 todos os padr\u00f5es (caso contr\u00e1rio, remova o <code>-y<\/code> ) e instalar o pacote de que precisamos para executar simultaneamente os dois projetos com um \u00fanico comando.<\/p>\n<p>Vamos configurar dois scripts chamados <code>cliente<\/code> e <code>servidor<\/code> para executar cada projeto individualmente e, em seguida, um <code>iniciar<\/code> para executar o cliente e o servidor ao mesmo tempo.<\/p>\n<p>Tamb\u00e9m usaremos <code>p\u00f3s-instala\u00e7\u00e3o<\/code> para executar o <code>npm install<\/code> de forma independente quando o script <code>npm install<\/code> est\u00e1 completo. <code>p\u00f3s-instala\u00e7\u00e3o<\/code> faz parte de <a href=\"https:\/\/docs.npmjs.com\/misc\/scripts\">Scripts npm<\/a> by default. All of these changes that we make below will enable someone to clone your repo, run `npm install &amp;&amp; npm start` to which will kick off all three installs, and then concurrently run each project.<\/p>\n<p>Substitua o <code>package.json<\/code> que acabou de ser adicionado com os scripts a seguir:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false lang:sh decode:true\" title=\"Scripts Package.json\">\"scripts\": {\r\n    \"cliente\": \"cd react-apollo-client &amp;&amp; npm start\",\r\n    \"server\" (servidor): \"cd couchbase-gql-server &amp;&amp; node server\",\r\n    \"start\": \"concurrently --kill-others \\\"npm run server\\\" \\\"npm run client\\\"\",\r\n    \"postinstall\": \"(cd couchbase-gql-server &amp;&amp; npm install); (cd react-apollo-client &amp;&amp; npm install);\"\r\n  },<\/pre>\n<p>Inicializamos o npm na raiz do nosso projeto, configuramos dois scripts para <code>cliente<\/code> e <code>servidor<\/code> que podemos executar simultaneamente com <code>npm start<\/code>. Al\u00e9m disso, quando algu\u00e9m clona nosso reposit\u00f3rio, agora pode executar: <code>npm install &amp;&amp; npm start<\/code> e ele instalar\u00e1 todos os pacotes dos tr\u00eas projetos e depois os ativar\u00e1, desde que eles tenham o Couchbase Server em execu\u00e7\u00e3o, tudo funcionar\u00e1.<\/p>\n<h2 id=\"remove-user-and-pass-from-server-file\">Remover usu\u00e1rio e senha do arquivo do servidor<\/h2>\n<p>Um toque final \u00e9 mover o nome de usu\u00e1rio e a senha de nossas credenciais de conex\u00e3o com o Couchbase para um <code>.env<\/code> arquivo. Isso garantir\u00e1 que n\u00e3o enviemos credenciais confidenciais ao GitHub para que o mundo as veja.<\/p>\n<p>Altere os diret\u00f3rios para <code>couchbase-gql-server\/<\/code> e instalar <code>dotenv<\/code>:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Instalar o pacote CORS\">npm install dotenv --save-dev<\/pre>\n<p>Em seguida, importe <code>dotenv<\/code> e usar a desestrutura\u00e7\u00e3o de objetos para obter acesso \u00e0s vari\u00e1veis que configuramos em nosso <code>.env<\/code> file:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:javascript decode:true\" title=\"Exigir usu\u00e1rio e senha .env\">require('dotenv').config()\r\nconst { cbUser, cbPass } = process.env<\/pre>\n<p>Atualize o c\u00f3digo em que usamos o nome de usu\u00e1rio e a senha:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:javascript decode:true\" title=\"Atualizar credenciais na conex\u00e3o do Couchbase\">const cluster = new couchbase.Cluster('couchbase:\/\/localhost', {\r\n  nome de usu\u00e1rio: cbUser, senha: cbPass\r\n})<\/pre>\n<p>Crie um arquivo em nosso <code>servidor couchbase-gql<\/code> diret\u00f3rio denominado <code>.env<\/code>\u00a0 com nossas credenciais do Couchbase Server:<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Credenciais do servidor de armazenamento\">cbUser=Administrador\r\ncbPass=senha<\/pre>\n<p>We also need to update the server directories `.gitignore` file. There is a block of ignores labeled `#misc`, let&#8217;s modify that block of ignores and add `.env` to it. Remember this file does not get uploaded to git as part of our course control.<\/p>\n<pre class=\"theme:vs2012 font:ubuntu-mono font-size:14 line-height:24 top-margin:0 h-align:1 toolbar:1 toolbar-overlay:false nums:false lang:sh decode:true\" title=\"Git Ignore\"># misc\r\n.DS_Store\r\n.env\r\n.env.local\r\n.env.development.local\r\n.env.test.local\r\n.env.production.local<\/pre>\n<p>Let&#8217;s run our project from the root using `npm start` to ensure that everything still works!<\/p>\n<h2 id=\"project-recap\">Recapitula\u00e7\u00e3o do projeto<\/h2>\n<p>Criamos um projeto fullstack de React e GraphQL. Utilizando <a href=\"https:\/\/docs.couchbase.com\/nodejs-sdk\/current\/hello-world\/start-using-sdk.html\">SDK do n\u00f3 do Couchbase<\/a> e do cliente e servidor Apollo GraphQL, aproveitamos nosso conhecimento de JavaScript para criar um aplicativo de pilha completa. Espero que este tutorial o ajude em sua busca para dominar o JavaScript de pilha completa.<\/p>\n<p>Estou dispon\u00edvel no Twitter <a href=\"https:\/\/www.twitter.com\/httpJunkie\">@httpJunkie<\/a>Se voc\u00ea quiser, sinta-se \u00e0 vontade para entrar em contato, meu DM est\u00e1 sempre aberto! Confira os links fornecidos abaixo para obter mais informa\u00e7\u00f5es sobre a cria\u00e7\u00e3o com Apollo e React.<\/p>\n<p>O c\u00f3digo final desse projeto pode ser encontrado no GitHub em:<br \/>\n<a href=\"https:\/\/github.com\/httpJunkie\/rage-with-couchbase-final\">github.com\/httpJunkie\/rage-with-couchbase-final<\/a><\/p>\n<h2>Recursos do Apollo e do React<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.apollographql.com\/\">Apollo GraphQL<\/a><\/li>\n<li><a href=\"https:\/\/www.apollographql.com\/docs\/\">Documenta\u00e7\u00e3o do Apollo GraphQL<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=Ct2-5dUfMMw\">Os benef\u00edcios do Apollo GraphQL<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/apollographql\/react-apollo\">React Apollo no GitHub<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=RCKkWjBuyfw\">Cliente Apollo com React no LevelUp Tuts<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=9Qw8HKatjy8\">Apollo + GraphQL + React - Pensando em consultas com James Baxley<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>The third of three articles focused on building Fullstack React and GraphQL with the Apollo GraphQL Client. Setting up a NoSQL Couchbase Server (Part 1) Building an Express-GraphQL API (Part 2) Create Apollo GraphQL Client in React (Part 3) Final [&hellip;]<\/p>","protected":false},"author":53002,"featured_media":10876,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1822,1812,2201],"tags":[2210,2454],"ppma_author":[8922],"class_list":["post-8222","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-node-js","category-n1ql-query","category-tools-sdks","tag-graphql","tag-react"],"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>Fullstack React and GraphQL : Apollo Client - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.\" \/>\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\/fullstack-react-apollo-3\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fullstack React and GraphQL : Apollo Client\" \/>\n<meta property=\"og:description\" content=\"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/fullstack-react-apollo-3\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-29T00:03:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:03:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Eric Bishard\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@httpJunkie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eric Bishard\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/\"},\"author\":{\"name\":\"Eric Bishard\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c\"},\"headline\":\"Fullstack React and GraphQL : Apollo Client\",\"datePublished\":\"2020-02-29T00:03:45+00:00\",\"dateModified\":\"2025-06-14T04:03:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/\"},\"wordCount\":2159,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg\",\"keywords\":[\"graphql\",\"React\"],\"articleSection\":[\"Couchbase Server\",\"Node.js\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/\",\"name\":\"Fullstack React and GraphQL : Apollo Client - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg\",\"datePublished\":\"2020-02-29T00:03:45+00:00\",\"dateModified\":\"2025-06-14T04:03:55+00:00\",\"description\":\"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg\",\"width\":1200,\"height\":628,\"caption\":\"RAGE With Couchbase Apollo-GraphQL Featured Image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fullstack React and GraphQL : Apollo Client\"}]},{\"@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\/67d3a4b597e42370ccd34b715a6b1f4c\",\"name\":\"Eric Bishard\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b7d1d2580c41d35a21654fb1abe65d23\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g\",\"caption\":\"Eric Bishard\"},\"description\":\"International speaker, blogging and advocating for the JavaScript, React, GraphQL and NoSQL community working as a Senior Developer Advocate for Couchbase.\",\"sameAs\":[\"https:\/\/www.reactstateofmind.com\",\"https:\/\/www.linkedin.com\/in\/eric-b\/\",\"https:\/\/x.com\/httpJunkie\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/eric-bishard\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fullstack React and GraphQL : Apollo Client - The Couchbase Blog","description":"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.","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\/fullstack-react-apollo-3\/","og_locale":"pt_BR","og_type":"article","og_title":"Fullstack React and GraphQL : Apollo Client","og_description":"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/fullstack-react-apollo-3\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-02-29T00:03:45+00:00","article_modified_time":"2025-06-14T04:03:55+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg","type":"image\/jpeg"}],"author":"Eric Bishard","twitter_card":"summary_large_image","twitter_creator":"@httpJunkie","twitter_misc":{"Written by":"Eric Bishard","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/"},"author":{"name":"Eric Bishard","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/67d3a4b597e42370ccd34b715a6b1f4c"},"headline":"Fullstack React and GraphQL : Apollo Client","datePublished":"2020-02-29T00:03:45+00:00","dateModified":"2025-06-14T04:03:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/"},"wordCount":2159,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg","keywords":["graphql","React"],"articleSection":["Couchbase Server","Node.js","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/","url":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/","name":"Fullstack React and GraphQL : Apollo Client - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg","datePublished":"2020-02-29T00:03:45+00:00","dateModified":"2025-06-14T04:03:55+00:00","description":"Create an Apollo GraphQL client for fetching data in our three part series on fullstack applications using React, Apollo, GraphQL and Express.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/02\/apollo-graphql-1.jpg","width":1200,"height":628,"caption":"RAGE With Couchbase Apollo-GraphQL Featured Image"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fullstack-react-apollo-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Fullstack React and GraphQL : Apollo Client"}]},{"@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\/67d3a4b597e42370ccd34b715a6b1f4c","name":"Eric Bishard","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b7d1d2580c41d35a21654fb1abe65d23","url":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","caption":"Eric Bishard"},"description":"Palestrante internacional, blogueiro e defensor da comunidade JavaScript, React, GraphQL e NoSQL, trabalhando como defensor s\u00eanior de desenvolvedores da Couchbase.","sameAs":["https:\/\/www.reactstateofmind.com","https:\/\/www.linkedin.com\/in\/eric-b\/","https:\/\/x.com\/httpJunkie"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/eric-bishard\/"}]}},"authors":[{"term_id":8922,"user_id":53002,"is_guest":0,"slug":"eric-bishard","display_name":"Eric Bishard","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a316a2658772914defd259571b8cad18878eb23c9d0cc3a97dd803deca0c09ca?s=96&d=mm&r=g","first_name":"Eric","last_name":"Bishard","user_url":"https:\/\/www.reactstateofmind.com","author_category":"","description":"Palestrante internacional, blogueiro e defensor da comunidade JavaScript, React, GraphQL e NoSQL, trabalhando como defensor s\u00eanior de desenvolvedores da Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8222","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\/53002"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=8222"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8222\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10876"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=8222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=8222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=8222"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=8222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}