11 GraphQL API开发教程:实现变更操作
在上一篇文章中,我们讨论了如何执行基本的查询操作。了解查询方法后,我们现在开始深入探讨如何在GraphQL中实现变更操作(Mutation)。变更操作主要用于创建、更新或删除数据。因此,在设计API时,尤其是对于涉及数据修改的需求,我们需要充分了解变更操作的实现。
变更操作的定义
在GraphQL中,变更操作使用mutation
关键字来定义。变更操作与查询操作的不同之处在于,变更操作会改变服务器上的数据状态。我们可以通过定义mutation
类型来描述这些操作。
1. 定义变更操作
假设我们有一个简单的图书管理系统。我们希望通过GraphQL API能够实现添加新书籍的功能。首先,我们在GraphQL的模式定义中,创建一个Mutation
类型。
type Mutation {
addBook(title: String!, author: String!): Book
}
在这个定义中,我们创建了一个名为addBook
的变更操作,它接受两个参数:title
和author
。该操作的返回类型是Book
。
2. 实现变更操作的解析器
解析器(Resolver)是用于处理变更操作的关键部分。我们需要实现addBook
的解析器,将传入的书名和作者插入到数据库中。
以下是一个简单的Node.js示例,采用Express和Apollo Server来实现这个解析器:
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客户端,我们可以发送如下变更请求:
mutation {
addBook(title: "深入浅出Node.js", author: "氏原田") {
id
title
author
}
}
执行上述变更操作后,我们会得到如下响应:
{
"data": {
"addBook": {
"id": "1",
"title": "深入浅出Node.js",
"author": "氏原田"
}
}
}
如我们所见,返回的addBook
对象包含了该书籍的id
、title
和author
字段。
4. 更新和删除书籍
在实现了添加书籍的变更操作后,我们也可以简单地扩展Mutation
类型来实现更新和删除操作。例如:
type Mutation {
addBook(title: String!, author: String!): Book
updateBook(id: ID!, title: String, author: String): Book
deleteBook(id: ID!): Book
}
相应的解析器也可以如下实现:
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功能。希望您在实现变更操作的过程中,能获得启发和帮助!如果您有任何问题,欢迎随时交流。