在上一篇文章中,我们讨论了如何执行基本的查询操作。了解查询方法后,我们现在开始深入探讨如何在GraphQL中实现变更操作(Mutation)。变更操作主要用于创建、更新或删除数据。因此,在设计API时,尤其是对于涉及数据修改的需求,我们需要充分了解变更操作的实现。
变更操作的定义
在GraphQL中,变更操作使用mutation
关键字来定义。变更操作与查询操作的不同之处在于,变更操作会改变服务器上的数据状态。我们可以通过定义mutation
类型来描述这些操作。
1. 定义变更操作
假设我们有一个简单的图书管理系统。我们希望通过GraphQL API能够实现添加新书籍的功能。首先,我们在GraphQL的模式定义中,创建一个Mutation
类型。
1 2 3
| type Mutation { addBook(title: String!, author: String!): Book }
|
在这个定义中,我们创建了一个名为addBook
的变更操作,它接受两个参数:title
和author
。该操作的返回类型是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 = [];
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; } } };
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
对象包含了该书籍的id
、title
和author
字段。
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的变更操作。我们定义了一些基本的变更函数,包括addBook
、updateBook
和deleteBook
,并通过解析器将它们与实际的业务逻辑连接起来。
在下一篇中,我们将继续讨论如何使用GraphQL提供的内置字段,进一步提升我们的API功能。希望您在实现变更操作的过程中,能获得启发和帮助!如果您有任何问题,欢迎随时交流。