📜  GraphQL-突变

📅  最后修改于: 2020-10-25 05:10:41             🧑  作者: Mango


在本章中,我们将学习GraphQL中的突变查询。

变异查询会修改数据存储区中的数据并返回一个值。它可用于插入,更新或删除数据。突变被定义为架构的一部分。

下面是突变查询的语法-

mutation{
   someEditOperation(dataField:"valueOfField"):returnType
}

插图

让我们了解如何使用突变查询将新的学生记录添加到数据存储中。

步骤1-下载并安装项目的必需依赖项

通过名称突变应用创建一个项目文件夹。从终端将目录更改为mutation-app。请按照“环境设置”一章中说明的步骤3到5进行操作。

第2步-创建一个schema.graphql文件

在项目文件夹mutation-app中添加schema.graphql文件,并添加以下代码-

type Query {
   greeting:String
}

type Mutation {
   createStudent(collegeId:ID,firstName:String,lastName:String):String
}

请注意,函数createStudent返回String类型。这是创建学生后生成的唯一标识符(ID)。

第3步-创建一个resolver.js文件

在项目文件夹中创建文件resolvers.js并添加以下代码-

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}

变异函数指向数据存储区中的学生集合。要添加新学生,请在学生集合中调用create方法。 args对象将包含在查询中传递的参数。学生集合的创建方法将返回一个新创建的学生对象的ID。

步骤4-运行应用程序

创建一个server.js文件。请参阅“环境设置”一章中的步骤8。在终端中执行命令npm start。服务器将启动并在9000端口上运行。在这里,我们使用GraphiQL作为客户端来测试应用程序。

下一步是打开浏览器,然后输入URL http:// localhost:9000 / graphiql 。在编辑器中键入以下查询-

//college Id should be matched with data from colleges.json for easy retrieval

mutation {
   createStudent(collegeId:"col-2",firstName:"Tim",lastName:"George")
}

上面的查询将在student.json文件中创建一个Student对象。查询将返回唯一的标识符。查询的响应如下所示-

{
   "data": {
      "createStudent": "SkQtxYBUm"
   }
}

为了验证是否创建了Student对象,我们可以使用studentById查询。您也可以从数据文件夹中打开students.json文件,以验证ID。

要使用studentById查询,请如下所示编辑schema.graphql-

type Query {
   studentById(id:ID!):Student
}

type Student {
   id:ID!
   firstName:String
   lastName:String
   collegeId:String
}

编辑以下的resolver.js文件-

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}

下面给出的是通过突变查询返回的唯一ID获取学生的查询-

{
    studentById(id:"SkQtxYBUm") {
    id
    firstName
    lastName
  }
}

来自服务器的响应如下-

{
   "data": {
      "studentById": {
         "id": "SkQtxYBUm",
         "firstName": "Tim",
         "lastName":"George"
      }
   }
}

返回变异对象

最好的做法是返回一个突变的对象。例如,客户端应用程序想要获取学生和大学的详细信息。在这种情况下,我们可以创建一个返回包含学生及其大学详细信息的对象的查询,而不是发出两个不同的请求。

步骤1-编辑架构文件

添加一个名为传递addStudent新方法,它返回的突变型schema.graphql的对象。

让我们学习如何通过学生详细信息访问大学详细信息。在模式文件中添加大学类型。

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
}

第2步-更新resolvers.js文件

更新项目文件夹中的文件resolvers.js并添加以下代码-

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}

第3步-启动服务器并在GraphiQL中键入请求查询

接下来,我们将使用以下代码启动服务器并在GraphiQL中请求查询-

mutation {
   addStudent_returns_object(collegeId:"col-101",firstName:"Susan",lastName:"George") {
      id
      firstName
      college{
         id
         name
      }
   }
}

上面的查询添加了一个新学生,并与大学对象一起检索了该学生对象。这样可以节省往返服务器的时间。

响应如下-

{
   "data": {
      "addStudent_returns_object": {
         "id": "rklUl08IX",
         "firstName": "Susan",
         "college": {
            "id": "col-101",
            "name": "AMU"
         }
      }
   }
}