首页
/ GraphQL-Yoga 基础教程:实现简单的Mutation操作

GraphQL-Yoga 基础教程:实现简单的Mutation操作

2025-07-07 02:13:01作者:蔡丛锟

前言

在构建GraphQL API时,Mutation操作是实现数据修改的关键部分。本文将基于GraphQL-Yoga框架,详细介绍如何为API添加Mutation功能,让客户端能够向服务器提交新的数据。

什么是Mutation?

在GraphQL中,Mutation是与Query相对应的概念:

  • Query用于获取数据(相当于REST中的GET)
  • Mutation用于修改数据(相当于REST中的POST/PUT/DELETE)

扩展Schema定义

首先需要在Schema中定义Mutation类型:

type Mutation {
  postLink(url: String!, description: String!): Link!
}

这个定义表示:

  1. 我们添加了一个名为postLink的Mutation字段
  2. 它接收两个必填参数:url和description
  3. 返回一个Link类型的对象

实现Resolver函数

Resolver是GraphQL中实际执行业务逻辑的部分。我们需要为postLink实现对应的resolver:

const resolvers = {
  Mutation: {
    postLink: (parent, args) => {
      const newLink = {
        id: `link-${links.length}`,
        description: args.description,
        url: args.url
      }
      links.push(newLink)
      return newLink
    }
  }
}

这段代码实现了:

  1. 生成一个简单的自增ID(实际项目中建议使用更可靠的ID生成方式)
  2. 从参数中获取url和description
  3. 创建新的link对象并添加到内存数组中
  4. 返回新创建的link对象

参数解析

注意resolver函数的第二个参数args:

  • 它包含了客户端发送的所有输入参数
  • 在我们的例子中,args包含url和description字段
  • 参数类型会自动根据Schema定义进行验证

测试Mutation

我们可以通过GraphiQL界面测试这个Mutation:

mutation {
  postLink(
    url: "www.example.com", 
    description: "示例网站"
  ) {
    id
    url
    description
  }
}

预期响应:

{
  "data": {
    "postLink": {
      "id": "link-1",
      "url": "www.example.com",
      "description": "示例网站"
    }
  }
}

当前实现的局限性

目前我们的实现有几个明显的限制:

  1. 数据仅存储在内存中,服务重启后会丢失
  2. ID生成方式过于简单,不适合生产环境
  3. 缺少输入验证和错误处理

这些限制将在后续教程中通过引入数据库和其他最佳实践来解决。

最佳实践建议

在实际项目中,建议:

  1. 使用数据库持久化数据
  2. 实现更健壮的ID生成策略(如UUID)
  3. 添加输入验证逻辑
  4. 实现适当的错误处理机制

总结

通过本文,我们学习了如何在GraphQL-Yoga中:

  1. 定义Mutation类型
  2. 实现对应的resolver函数
  3. 处理输入参数
  4. 测试Mutation操作

这为构建完整的CRUD功能打下了基础。在接下来的教程中,我们将进一步完善这个API,添加数据持久化等更高级的功能。