变更(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
关键字开始,后跟操作名称(可选)和一系列操作。 -
示例:
phpmutation AddUser($username: String!, $email: String!) { addUser(username: $username, email: $email) { id username email } }
变更与查询的不同
- 执行顺序:查询(Query)中的字段是并行执行的,而变更(Mutation)中的字段则是顺序执行的,以避免产生竞态条件。
变更的响应
- 返回数据:变更操作可以返回数据,例如,一个添加用户的变更可能返回新用户的信息。
- 示例 :上述
AddUser
变更返回了新用户的id
、username
和email
。
变更的变量
- 使用变量:与查询类似,变更也可以使用变量。这对于传递动态数据(如用户输入)至变更操作中非常有用。
- 示例 :在
AddUser
变更中,使用了$username
和$email
作为变量。
变更的作用域
- 单个请求:尽管可以在单个变更请求中包含多个变更操作,但通常建议每个请求只包含一个变更,以便于管理和调试。
直接作用
- 实时更新:执行变更后,数据会立即更新。如果需要新的数据状态,可以在变更操作中请求所需的字段。
错误处理
- 错误反馈:如果变更失败,GraphQL会返回错误信息,可以用于前端显示错误或调试。
安全性和权限
- 安全考虑:对于更改数据的操作,需要考虑安全性和权限控制,确保只有授权用户可以执行变更。
实际应用
- 场景:变更用于各种数据写操作,如添加、更新、删除数据记录。
操作名称
- 明确定义:给变更操作指定明确的名称有助于在日志和调试过程中识别特定的变更请求。
以上就是GraphQL中关于变更的主要知识点。这些概念涵盖了从变更的基本定义到其使用、执行和管理的各个方面,为理解如何在GraphQL中执行数据修改操作提供了全面的视角。如果有特定方面需要深入了解,请随时告知。
更新代码:input的使用
在GraphQL中,input
类型是一种特殊的对象类型,用于将复杂对象作为参数传递给变更(Mutation)和查询(Query)。与普通的对象类型相比,input
类型只能用于传入参数,而不用于查询返回的结果。这对于结构化和规范化传入数据非常有用,特别是当操作(比如一个变更)需要接收多个字段时。
修改schema.graphql以使用input类型
我们可以通过定义一个input
类型来简化addUser
变更的参数。假设我们有一个UserInput
类型,它包括username
和email
字段。
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
类型的对象。