GraphQL - Mutação
Neste capítulo, aprenderemos as consultas de mutação em GraphQL.
As consultas de mutação modificam os dados no armazenamento de dados e retornam um valor. Ele pode ser usado para inserir, atualizar ou excluir dados. As mutações são definidas como parte do esquema.
A sintaxe de uma consulta de mutação é fornecida abaixo -
mutation{
someEditOperation(dataField:"valueOfField"):returnType
}
Ilustração
Vamos entender como adicionar um novo registro de aluno ao armazenamento de dados usando uma consulta de mutação.
Etapa 1 - Baixe e instale as dependências necessárias para o projeto
Crie uma pasta de projeto com o nome mutation-app. Mude seu diretório para mutation-app no terminal. Siga as etapas 3 a 5 explicadas no capítulo Configuração do ambiente.
Etapa 2 - Criar um arquivo schema.graphql
Adicionar schema.graphql arquivo na pasta do projeto mutation-app e adicione o seguinte código -
type Query {
greeting:String
}
type Mutation {
createStudent(collegeId:ID,firstName:String,lastName:String):String
}
Observe que a função createStudent retorna um tipo String. Este é um identificador único (ID) gerado após a criação de um aluno.
Etapa 3 - Criar um arquivo resolver.js
Crie um arquivo resolvers.js na pasta do projeto e adicione o seguinte código -
const db = require('./db')
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName})
}
}
const Query = {
greeting:() => "hello"
}
module.exports = {Query,Mutation}
A função de mutação aponta para a coleção dos alunos no armazenamento de dados. Para adicionar um novo aluno , invoque o método de criação na coleção de alunos. O objeto args conterá os parâmetros que são passados na consulta. O método de criação da coleção de alunos retornará o id de um objeto de aluno recém-criado.
Etapa 4 - Executar o aplicativo
Criar uma server.jsArquivo. Consulte a etapa 8 no capítulo Configuração do ambiente. Execute o comando npm start no terminal. O servidor estará instalado e funcionando na porta 9000. Aqui, usamos GraphiQL como um cliente para testar o aplicativo.
O próximo passo é abrir o navegador e digitar o URL http://localhost:9000/graphiql. Digite a seguinte consulta no editor -
//college Id should be matched with data from colleges.json for easy retrieval
mutation {
createStudent(collegeId:"col-2",firstName:"Tim",lastName:"George")
}
A consulta acima criará um objeto de aluno no arquivo student.json. A consulta retornará um identificador exclusivo. A resposta da consulta é mostrada abaixo -
{
"data": {
"createStudent": "SkQtxYBUm"
}
}
Para verificar se o objeto aluno foi criado, podemos usar a consulta studentById. Você também pode abrir o arquivo students.json da pasta de dados para verificar a id.
Para usar a consulta studentById, edite o schema.graphql como dado abaixo -
type Query {
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
collegeId:String
}
Edite o resolver.js arquivo conforme fornecido abaixo -
const db = require('./db')
const Query = {
studentById:(root,args,context,info) => {
return db.students.get(args.id);
}
}
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName})
}
}
module.exports = {Query,Mutation}
A seguir está a consulta para obter o aluno por id único retornado da consulta de mutação -
{
studentById(id:"SkQtxYBUm") {
id
firstName
lastName
}
}
A resposta do servidor é a seguinte -
{
"data": {
"studentById": {
"id": "SkQtxYBUm",
"firstName": "Tim",
"lastName":"George"
}
}
}
Retornando um objeto em mutação
É uma prática recomendada retornar um objeto em mutação. Por exemplo, o aplicativo cliente deseja obter detalhes de alunos e faculdades. Nesse caso, em vez de fazer duas solicitações diferentes, podemos criar uma consulta que retorna um objeto contendo alunos e seus detalhes de faculdade.
Etapa 1 - Editar Arquivo de Esquema
Adicione um novo método chamado addStudent que retorna o objeto em tipo de mutação de schema.graphql.
Vamos aprender como acessar os detalhes da faculdade por meio dos dados do aluno. Adicione o tipo de faculdade no arquivo de esquema.
type Mutation {
addStudent_returns_object(collegeId:ID,firstName:String,lastName:String):Student
createStudent(collegeId:ID,firstName:String,lastName:String):String
}
type College {
id:ID!
name:String
location:String
rating:Float
}
type Student {
id:ID!
firstName:String
lastName:String
college:College
}
Etapa 2 - Atualizar o arquivo resolvers.js
Atualizar um arquivo resolvers.js na pasta do projeto e adicione o seguinte código -
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({
collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName
})
},
// new resolver function
addStudent_returns_object:(root,args,context,info) => {
const id = db.students.create({
collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName
})
return db.students.get(id)
}
}
//for each single student object returned,resolver is invoked
const Student = {
college:(root) => {
return db.colleges.get(root.collegeId);
}
}
module.exports = {Query,Student,Mutation}
Etapa 3 - Inicie o servidor e digite a consulta de solicitação no GraphiQL
Em seguida, devemos iniciar o servidor e solicitar a consulta em GraphiQL com o seguinte código -
mutation {
addStudent_returns_object(collegeId:"col-101",firstName:"Susan",lastName:"George") {
id
firstName
college{
id
name
}
}
}
A consulta acima adiciona um novo aluno e recupera o objeto aluno junto com o objeto faculdade. Isso economiza viagens de ida e volta para o servidor.
A resposta é a seguinte -
{
"data": {
"addStudent_returns_object": {
"id": "rklUl08IX",
"firstName": "Susan",
"college": {
"id": "col-101",
"name": "AMU"
}
}
}
}