Jupyter AI

11 GraphQL API开发教程:实现变更操作

📅 发表日期: 2024年8月15日

分类: 🔗GraphQL API 开发入门

👁️阅读: --

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

变更操作的定义

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

1. 定义变更操作

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

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

在这个定义中,我们创建了一个名为addBook的变更操作,它接受两个参数:titleauthor。该操作的返回类型是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对象包含了该书籍的idtitleauthor字段。

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的变更操作。我们定义了一些基本的变更函数,包括addBookupdateBookdeleteBook,并通过解析器将它们与实际的业务逻辑连接起来。

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