graphql: Mutation & input

变更(Mutations)基本概念

  • 用途:在GraphQL中,变更用于修改服务器上的数据,类似于REST API中的POST、PUT、PATCH和DELETE操作。
  • 结构:变更操作的结构类似于查询(Query),但用于表示写操作。

后端处理

步骤1:创建GraphQL Schema文件

首先,创建一个名为schema.graphql的文件,其中包含你的类型定义和变更。

typescript 复制代码
# schema.graphql

type Mutation {
  addUser(username: String!, email: String!): User
}

type User {
  id: ID!
  username: String!
  email: String!
}

这个文件定义了一个addUser变更和一个User类型。

步骤2:实现解析器

在你的Node.js应用中,创建一个解析器来处理addUser变更。

java 复制代码
javascriptCopy code
// resolvers.js

const resolvers = {
  Mutation: {
    addUser: async (_, { username, email }) => {
      // 实现添加用户的逻辑
      return {
        id: "1", // 假设这是数据库生成的ID
        username,
        email
      };
    },
  },
};

module.exports = resolvers;

步骤3:设置Apollo Server

接下来,创建并设置Apollo Server实例,使用.graphql文件作为Schema源。

v4 复制代码
// server.js
const { ApolloServer } = require('apollo-server');
const { readFileSync } = require('fs');
const path = require('path');
const resolvers = require('./resolvers');

const typeDefs = readFileSync(path.join(__dirname, 'schema.graphql'), 'utf-8');

const server = new ApolloServer({ typeDefs, resolvers });
const { url } = await startStandaloneServer(server, {
  context: async ({ req }) => ({ token: req.headers.token }),
  listen: { port: 4000 },
});
console.log(`🚀  Server ready at ${url}`);

client处理

创建变更

  • 语法 :变更通过mutation关键字开始,后跟操作名称(可选)和一系列操作。

  • 示例

    php 复制代码
    mutation AddUser($username: String!, $email: String!) {
      addUser(username: $username, email: $email) {
        id
        username
        email
      }
    }

变更与查询的不同

  • 执行顺序:查询(Query)中的字段是并行执行的,而变更(Mutation)中的字段则是顺序执行的,以避免产生竞态条件。

变更的响应

  • 返回数据:变更操作可以返回数据,例如,一个添加用户的变更可能返回新用户的信息。
  • 示例 :上述AddUser变更返回了新用户的idusernameemail

变更的变量

  • 使用变量:与查询类似,变更也可以使用变量。这对于传递动态数据(如用户输入)至变更操作中非常有用。
  • 示例 :在AddUser变更中,使用了$username$email作为变量。

变更的作用域

  • 单个请求:尽管可以在单个变更请求中包含多个变更操作,但通常建议每个请求只包含一个变更,以便于管理和调试。

直接作用

  • 实时更新:执行变更后,数据会立即更新。如果需要新的数据状态,可以在变更操作中请求所需的字段。

错误处理

  • 错误反馈:如果变更失败,GraphQL会返回错误信息,可以用于前端显示错误或调试。

安全性和权限

  • 安全考虑:对于更改数据的操作,需要考虑安全性和权限控制,确保只有授权用户可以执行变更。

实际应用

  • 场景:变更用于各种数据写操作,如添加、更新、删除数据记录。

操作名称

  • 明确定义:给变更操作指定明确的名称有助于在日志和调试过程中识别特定的变更请求。

以上就是GraphQL中关于变更的主要知识点。这些概念涵盖了从变更的基本定义到其使用、执行和管理的各个方面,为理解如何在GraphQL中执行数据修改操作提供了全面的视角。如果有特定方面需要深入了解,请随时告知。

更新代码:input的使用

在GraphQL中,input类型是一种特殊的对象类型,用于将复杂对象作为参数传递给变更(Mutation)和查询(Query)。与普通的对象类型相比,input类型只能用于传入参数,而不用于查询返回的结果。这对于结构化和规范化传入数据非常有用,特别是当操作(比如一个变更)需要接收多个字段时。

修改schema.graphql以使用input类型

我们可以通过定义一个input类型来简化addUser变更的参数。假设我们有一个UserInput类型,它包括usernameemail字段。

python 复制代码
# schema.graphql

type Mutation {
  addUser(input: UserInput!): User
}

input UserInput {
  username: String!
  email: String!
}

type User {
  id: ID!
  username: String!
  email: String!
}

在这个定义中,UserInput是一个input类型,用于封装addUser变更的参数。

修改resolvers.js以处理新的input类型

接下来,我们需要更新解析器以处理新的UserInput类型。

javascript 复制代码
// resolvers.js

const resolvers = {
  Mutation: {
    addUser: async (_, { input }) => {
      // 使用input参数中的数据
      const { username, email } = input;

      // 实现添加用户的逻辑
      return {
        id: "1", // 假设这是数据库生成的ID
        username,
        email
      };
    },
  },
};

module.exports = resolvers;

在这个解析器中,我们现在接收一个名为input的参数,它是一个UserInput类型的对象。

相关推荐
赵大仁12 天前
【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案
后端·架构·graphql
江沉晚呤时18 天前
GraphQL在.NET 8中的全面实践指南
microsoft·ui·c#·.net·.netcore·graphql
weloveut1 个月前
西门子WinCC Unified PC的GraphQL使用手册
后端·python·graphql
编程乐趣1 个月前
基于.Net Core开发的GraphQL开源项目
后端·.netcore·graphql
web前端超级个体户2 个月前
如何优雅配置 Apollo Client 以支持本地 Subgraph 开发
graphql
亿牛云爬虫专家2 个月前
GraphQL接口采集:自动化发现和提取隐藏数据字段
爬虫·爬虫代理·graphql·代理ip·yelp·采集·数字字段
web前端超级个体户2 个月前
Apollo Client Cache的缓存原理
graphql
canonical_entropy2 个月前
Nop入门-如何通过配置扩展服务函数的返回对象
spring·mvc·graphql
kngines3 个月前
【实战ES】实战 Elasticsearch:快速上手与深度实践-7.3.2使用GraphQL封装查询接口
大数据·elasticsearch·搜索引擎·graphql
whoamiZQ4 个月前
GraphQL-Client 使用教程与常见问题处理
java·graphql