<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ikaro-silva</title>
    <description>The latest articles on Forem by Ikaro-silva (@ikarosilva).</description>
    <link>https://forem.com/ikarosilva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1022766%2Ff04fd918-ab76-4792-a6c5-7c31f60c212d.jpeg</url>
      <title>Forem: Ikaro-silva</title>
      <link>https://forem.com/ikarosilva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ikarosilva"/>
    <language>en</language>
    <item>
      <title>Como montar Uma API com GraphQl em Node.js com Apollo Server e MongoDB</title>
      <dc:creator>Ikaro-silva</dc:creator>
      <pubDate>Thu, 09 Feb 2023 02:32:31 +0000</pubDate>
      <link>https://forem.com/ikarosilva/como-montar-uma-api-com-graphql-em-nodejs-com-apollo-server-e-mongodb-bpg</link>
      <guid>https://forem.com/ikarosilva/como-montar-uma-api-com-graphql-em-nodejs-com-apollo-server-e-mongodb-bpg</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aR_pGNj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ne7qo39hbzfd8hkswzyq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aR_pGNj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ne7qo39hbzfd8hkswzyq.jpeg" alt="Image description" width="738" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sobre o tutorial&lt;/strong&gt;&lt;br&gt;
  A proposta é fazer um API que possa gerenciar Usuários fazendo operações CRUD com os dados.&lt;br&gt;
No servidor usaremos Node.js, vamos começar a desenvolver a nossa API em GraphQl?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tecnologias&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;     Node.js(plataforma usada)&lt;/li&gt;
&lt;li&gt;     Apollo-Server(usado para montar o servidor)&lt;/li&gt;
&lt;li&gt;     MongoBD(banco de dados)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Estrutura do projeto:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; -API_GraphQL
     - src
          -config
              -DBconfig.js
          -model
              -user.model.js
          -resolvers
              -index.js
              -userResolver.js
          -typeDefs
              -index.js
              -mutation.js
              -query.js
              -types.js
     -.gitignore
     -package-lock.json
     -package.json
     -server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Iniciando com o Node.Js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra o terminal no local da pasta do projeto API_GraphQ execute o comando acima&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalando dependências&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Apollo-Server,GraphQL, mongoose, dotenv&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; npm install graphql apollo-server mongoose dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na pasta do projeto API_GraphQ execute o comando acima.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;graphql: Montar schemas e executar queries GraphQL&lt;/li&gt;
&lt;li&gt;apollo-server: Montar servidor GraphQL(tem ferramenta de suporte para teste da api)&lt;/li&gt;
&lt;li&gt;mongoose: Montar o model para o banco de dados e estabelecer conexão com o MongoDB&lt;/li&gt;
&lt;li&gt;dotenv: Montar variáveis de ambiente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GraphQL/Apollo-Server/MongoDB&lt;/strong&gt;&lt;br&gt;
Precisamos definir algumas necessidades do servidor GraphQL, seriam o typeDefs e o resorvers, além disso ainda existe o model&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Principais itens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeDefs(Definição de tipo):Modelar dados com base nos Schemas&lt;/li&gt;
&lt;li&gt;Resolvers: Definir como será feita cada ação dentro do banco de dados&lt;/li&gt;
&lt;li&gt;Model: Definir campos usados no banco de dados 
Configurando servidor/conexão com banco de dados
Na pasta API_GraphQL, crie uma pasta src&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em  &lt;em&gt;API_GraphQL/src&lt;/em&gt; crie um arquivo server.js&lt;/p&gt;

&lt;p&gt;Caminho:&lt;em&gt;API_GraphQL/src/server.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { ApolloServer }=require("apollo-server")
const mongose=require('mongoose')
const typeDefs=require('./src/typeDefs/index')
const resolvers=require('./src/resolvers/index')
const DBconfig=require('./src/config/DBconfig')


//BANCO DE DADOS
    mongose.set('strictQuery', false)
    mongose.connect(DBconfig.URI)
    .then(()=&amp;gt;{
        console.log('Banco de dados conectado')
    })
    .catch(err=&amp;gt;{
        console.log('Falha ao conectar ao banco de dados',err)
    })

//SERVIDOR
  const server = new ApolloServer({ typeDefs, resolvers });
  server.listen()
  .then(({url})=&amp;gt;{
      console.log('servidor conectado na url',url)
  }).catch(err=&amp;gt;{
      console.log('falha ao se conectar ao servidor',err)
  })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na conexão do servidor temos chamadas para os arquivos resolvers e typeDefs,vamos cria-los?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criando definições de tipo (typeDefs)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;O typeDefs é uma junção de 3 itens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Types: Definir dados com base nos tipos de schemas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Query: Definir comando de consultas da api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mutation: Definir comandos que mudam os dados da api&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para criarmos as definições de tipo crie uma pasta typeDefs em &lt;em&gt;API_GraphQL/src&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/typeDefs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Crie os seguinte arquivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; -typeDefs
      -index.js
      -mutation.js
      -query.js
      -types.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Types&lt;/strong&gt;&lt;br&gt;
vamos começar com criando os typos (type), dentro da API GraphQl ele é responsável por modelar os dados, sempre em concordância com os schemas do model definido pelo mongoose e o mongoDB.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;typeDefs/types.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/typeDefs/types.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const{ gql }=require('apollo-server')

const types = gql`
type User {
  id: ID
  nome: String!
  email: String!
  senha: String!
}
`;

module.exports=types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;br&gt;
Agora vamos montar a query. Vamos montar 2 queries : uma que retorna um array de usuários e o outro vai retornar somente um usuário a partir de um id informado.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;typeDefs/types.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/typeDefs/query.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const{gql}=require ('apollo-server')
const query=gql`
    type Query{
        users:[User]!
        user(id:ID!):User!
    }
`;
module.exports=query
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto as queries estão definidas. No trecho de código acima dissemos ao servidor que a query chamada useres deve retornar um array com dados do tipo User (definido no passo anterior) e a query chamada user deve ter um parâmetro chamado id com um dado do tipo ID (já existente em GraphQL) e retornar um ítem do tipo User. A exclamação (!) define o campo como obrigatório.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mutation&lt;/strong&gt;&lt;br&gt;
Agora vamos definir a mutation, essa parte é parecida com as queries. Mutations são queries responsáveis por alteração de dados.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;typeDefs/types.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/typeDefs/mutation.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const {gql}=require('apollo-server')
const mutation=gql`
type Mutation {
  createUser(user: CreateUserInput!): User!
  updateUser(id: ID!, user: UpdateUserInput!): User!
  deleteUser(id: ID!):User
}
input CreateUserInput {
  nome: String!
  email: String!
  senha: String!
}
input UpdateUserInput {
  nome: String
  email: String
  senha: String
}
type User {
  id: ID!
  nome: String!
  email: String!
  senha: String!
}
`;
module.exports=mutation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além do tipo Mutation estão definidos alguns tipos input, esses inputs são para separar os parâmetros passados a mutation a fim de deixar as assinaturas mais limpas e de fácil manutenção.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão de typeDefs&lt;/strong&gt;&lt;br&gt;
Para concluir essa parte. Em &lt;em&gt;typeDefs/types.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/typeDefs/query.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const query= require('./query')
  const mutation= require('./mutation')
  const types = require('./types')

  const typeDefs=[query,mutation,types]

  module.exports=typeDefs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Criando models&lt;/strong&gt;&lt;br&gt;
Vamos definir o model User para que possamos modelar os dados do banco de dados usando os resolvers.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;model/-user.model.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/model/-user.model.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const mongoose=require('mongoose')
    const userSchema=new mongoose.Schema({
        nome:{
            type:String
        },
        email:{
            type:String
        },
        senha:{
            type:String
        },

    })

    const User=mongoose.model('User',userSchema)

    module.exports=User

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Criando Resolvers&lt;/strong&gt;&lt;br&gt;
Resolvers é aonde associamos quais ações queries e mutations devem tomar e lá também é aonde é definido as chamadas feitas no banco de dados. Então usamos o model apara implementar essas ações no banco de dados.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;resolvers/userResolver.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/resolvers/userResolver.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const User= require('../model/user.model')
  const useResolver={
      Query:{
          async users(){
              const useres =await User.find({})
              if(useres==null){
                  console.log("falha na consulta")
                  return
              }
              else{

                  return useres
              }

          },
          async user(_, {id}){
              const userid=await User.findById(id)
              return userid
          },
      },
      Mutation:{
          createUser(_,{user}){
              const newUser=new User(user)

              return newUser.save()
          },
          async updateUser(_,{id,user}){

              const userUpda=await User.findByIdAndUpdate(id,user)
              return userUpda
          },
          async deleteUser(_, { id }) {

              const deteUser=await User.findByIdAndRemove(id);
              return deteUser
           },
      }
  }
  module.exports=useResolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste arquivo usamos métodos expostos pela biblioteca Mongoose onde criamos a model no passo anterior. Dessa forma associamos as queries e mutations criadas nas definições de tipos à ações no banco de dados MongoDB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conectando banco de dados&lt;/strong&gt;&lt;br&gt;
Para conectar ao banco usaremos DotEnv para armazenar as credenciais do banco. Essa biblioteca permite criar variáveis de ambiente onde podemos ter as credenciais do banco ao invés de tê-las no código o que comprometeria as informações deixando disponíveis a qualquer pessoas com acesso ao código, por exemplo, num repositório git.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;API_GraphQL/.env&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/.env&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URI=mongodb://localhost:27017/GraphQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configurando variáveis&lt;/strong&gt;&lt;br&gt;
Arquivo responsável por configurar as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;Em &lt;em&gt;config/DBconfig.js&lt;/em&gt; escreva o seguinte código:&lt;/p&gt;

&lt;p&gt;Caminho: &lt;em&gt;API_GraphQL/src/config/DBconfig.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const dotenv =require('dotenv')
dotenv.config()

// variavel de ambiente "URI" do mongodb
module.exports={
    URI:process.env.URI
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pronto,nossa API-GraphQL está pronta!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testando a API&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iniciando API&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node .server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Criar usuários:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; mutation createUser{
    createUser(user:{
    nome:"ikaro silva",
    email:"ikaro@gmail.com",
    senha:"123654987"})
    {
      id
      nome
      email
      senha
    }
  }
Consultar todos usuários:
    query users{
      users {
        id
        nome
        email
        senha
      }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Consultar por id:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query userID{
  user(id:"63e29267d39499c37d9496e2") {
    id
    nome
    email
    senha
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Editar por id:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mutation editar{
updateUser(id:"63e29267d39499c37d9496e2", user:{
nome: "ikaro silva",
email:"ikaro@gmail.com",
senha:"123654987"
}){
  id
  nome
  email
  senha
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Deletar por Id:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mutation deleteID{
   deleteUser(id:"63e29267d39499c37d9496e2") {
    id
    nome
    email
    senha
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Para mais informações de como usar queries e mutations acesse:&lt;br&gt;
&lt;a href="https://graphql.org/learn/queries/"&gt;GraphQl&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Todos os testes foram executado na ferramenta que o apollo-server disponibilizar:&lt;br&gt;
&lt;a href="https://studio.apollographql.com/sandbox/explorer"&gt;Ferramenta do Apollo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>graphql</category>
      <category>mongodb</category>
    </item>
  </channel>
</rss>
