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类型的对象。

相关推荐
忙碌5447 天前
区块链应用开发的完整实战指南:从理论到落地的企业级解决方案
架构·区块链·restful·graphql
yuki_uix16 天前
GraphQL 重塑:从 API 语言到 AI 时代的"逻辑神经系统"
前端·graphql
果粒蹬i19 天前
【HarmonyOS】RN of HarmonyOS实战开发项目+Apollo GraphQL客户端
华为·harmonyos·graphql
程序猿阿伟19 天前
《GraphQL批处理与全局缓存共享的底层逻辑》
后端·缓存·graphql
程序猿阿伟20 天前
《GraphQL状态图建模与低时延控制能力解析》
后端·graphql
程序猿阿伟20 天前
《面向第三方的GraphQL开放平台设计指南》
后端·graphql
程序猿阿伟21 天前
《GraphQL 强类型架构下的错误处理体系设计指南》
后端·架构·graphql
爬山算法1 个月前
Hibernate(78)如何在GraphQL服务中使用Hibernate?
java·hibernate·graphql
Irene19911 个月前
HTTP 请求方法选择与 RESTful 实践(对比 GraphQL、RPC)
rpc·restful·http请求·grpc·graphql
Dontla1 个月前
GraphQL介绍(声明式查询)文件上传GraphQL文件上传
后端·graphql