11 实现变更操作

在上一篇文章中,我们讨论了如何执行基本的查询操作。了解查询方法后,我们现在开始深入探讨如何在GraphQL中实现变更操作(Mutation)。变更操作主要用于创建、更新或删除数据。因此,在设计API时,尤其是对于涉及数据修改的需求,我们需要充分了解变更操作的实现。

变更操作的定义

在GraphQL中,变更操作使用mutation关键字来定义。变更操作与查询操作的不同之处在于,变更操作会改变服务器上的数据状态。我们可以通过定义mutation类型来描述这些操作。

1. 定义变更操作

假设我们有一个简单的图书管理系统。我们希望通过GraphQL API能够实现添加新书籍的功能。首先,我们在GraphQL的模式定义中,创建一个Mutation类型。

1
2
3
type Mutation {
addBook(title: String!, author: String!): Book
}

在这个定义中,我们创建了一个名为addBook的变更操作,它接受两个参数:titleauthor。该操作的返回类型是Book

2. 实现变更操作的解析器

解析器(Resolver)是用于处理变更操作的关键部分。我们需要实现addBook的解析器,将传入的书名和作者插入到数据库中。

以下是一个简单的Node.js示例,采用Express和Apollo Server来实现这个解析器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const { ApolloServer, gql } = require('apollo-server');

// 模拟一个数据库
let books = [];

// 定义GraphQL类型
const typeDefs = gql`
type Book {
id: ID!
title: String!
author: String!
}

type Mutation {
addBook(title: String!, author: String!): Book
}
`;

// 实现解析器
const resolvers = {
Mutation: {
addBook: (parent, { title, author }) => {
const book = { id: books.length + 1, title, author };
books.push(book);
return book;
}
}
};

// 创建Apollo Server
const server = new ApolloServer({ typeDefs, resolvers });

// 启动服务
server.listen().then(({ url }) => {
console.log(`🚀 服务器运行在 ${url}`);
});

在这个例子中,我们使用了一个简单的数组来模拟数据库。每次调用addBook时,我们将新书籍添加到books数组中,并返回这个新书籍的对象。

3. 执行变更操作

一旦我们定义好了变更操作和解析器,就可以通过GraphQL的变更调用来添加书籍。使用graphql-playground或其他GraphQL客户端,我们可以发送如下变更请求:

1
2
3
4
5
6
7
mutation {
addBook(title: "深入浅出Node.js", author: "氏原田") {
id
title
author
}
}

执行上述变更操作后,我们会得到如下响应:

1
2
3
4
5
6
7
8
9
{
"data": {
"addBook": {
"id": "1",
"title": "深入浅出Node.js",
"author": "氏原田"
}
}
}

如我们所见,返回的addBook对象包含了该书籍的idtitleauthor字段。

4. 更新和删除书籍

在实现了添加书籍的变更操作后,我们也可以简单地扩展Mutation类型来实现更新和删除操作。例如:

1
2
3
4
5
type Mutation {
addBook(title: String!, author: String!): Book
updateBook(id: ID!, title: String, author: String): Book
deleteBook(id: ID!): Book
}

相应的解析器也可以如下实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Mutation: {
// 其他变更操作...

updateBook: (parent, { id, title, author }) => {
const book = books.find(b => b.id == id);
if (!book) throw new Error("Book not found");
if (title) book.title = title;
if (author) book.author = author;
return book;
},

deleteBook: (parent, { id }) => {
const index = books.findIndex(b => b.id == id);
if (index === -1) throw new Error("Book not found");
const deletedBook = books.splice(index, 1);
return deletedBook[0];
}
}

5. 小结

在本篇中,我们探讨了如何实现GraphQL的变更操作。我们定义了一些基本的变更函数,包括addBookupdateBookdeleteBook,并通过解析器将它们与实际的业务逻辑连接起来。

在下一篇中,我们将继续讨论如何使用GraphQL提供的内置字段,进一步提升我们的API功能。希望您在实现变更操作的过程中,能获得启发和帮助!如果您有任何问题,欢迎随时交流。

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论