GraphQL - 变异 GraphQL - 查询 GraphQL - 验证 在本章中,我们将学习GraphQL中的变异查询。 变异查询修改数据存储中的数据并返回值。它可用于插入,更新或删除数据。变异被定义为模式的一部分。 突变查询的语法如下 mutation{ someEditOperation(dataField:"valueOfField"):returnType } 插图 让我们了解如何使用变异查询将新学生记录添加到数据存储区。 步骤1 - 下载并安装项目所需的依赖项 通过名称mutation-app创建项目文件夹。将目录从终端更改为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" } } 要验证是否已创建学生对象,我们可以使用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" } } } } GraphQL - 查询 GraphQL - 验证