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

相关推荐
web前端超级个体户8 天前
Apollo Client Cache的缓存原理
graphql
canonical_entropy8 天前
Nop入门-如何通过配置扩展服务函数的返回对象
spring·mvc·graphql
kngines1 个月前
【实战ES】实战 Elasticsearch:快速上手与深度实践-7.3.2使用GraphQL封装查询接口
大数据·elasticsearch·搜索引擎·graphql
whoamiZQ2 个月前
GraphQL-Client 使用教程与常见问题处理
java·graphql
桂月二二2 个月前
使用 SurrealDB 构建高效的 GraphQL 后端
后端·graphql
大梦百万秋2 个月前
探索 GraphQL:API 设计的未来趋势
后端·graphql
老大白菜2 个月前
使用 Go 和 gqlgen 实现 GraphQL API:实战指南
开发语言·golang·graphql
老大白菜2 个月前
Egg.js GraphQL 完整指南
开发语言·javascript·graphql
老大白菜2 个月前
GraphQL 教程
后端·graphql
Мартин.3 个月前
[Meachines] [Easy] Help HelpDeskZ-SQLI+NODE.JS-GraphQL未授权访问+Kernel<4.4.0权限提升
后端·node.js·graphql