GraphQL 是一种用于 API 构建的查询语言,它具有强大的类型系统和灵活的查询机制。其中,mutation 操作是一种用于修改数据的 GraphQL 操作。在 GraphQL Schema 中,mutation 操作具有以下特性:
1. mutation 操作的声明
在 GraphQL Schema 中声明一个 mutation 操作需要使用 type Mutation
关键字,例如:
type Mutation { addUser(input: UserInput!): User! }
上述代码声明了一个名为 addUser
的 mutation 操作,它接受一个 UserInput
类型的输入参数,并返回一个 User
类型的输出结果。
2. mutation 操作的 resolver
mutation 操作的 resolver 用于解析与之对应的具体业务逻辑,例如将用户输入的数据存储到数据库中。一个简单的 addUser
mutation resolver 可以这样实现:
Mutation: { addUser: (_root, { input }) => { const user = new User(input); return user.save(); }, }
3. mutation 参数的定义
与普通的 GraphQL 查询不同,mutation 操作允许定义必填参数和默认值。例如:
input UserInput { name: String! age: Int = 18 }
上述代码定义了一个 UserInput
类型的输入参数,其中 name
参数为必填项,而 age
参数具有默认值 18。
4. mutation 操作的返回值
mutation 操作的返回值通常是被修改后的数据对象。通常情况下,为了提高查询效率,返回值应该只包含必要的属性。例如:
type User { name: String! age: Int! createdAt: Date! }
上述代码定义了一个 User
类型,它只包含了 name
、age
和 createdAt
三个属性。
5. mutation 操作的参数验证
由于 GraphQL Schema 中的 mutation 操作可以接受任意类型的输入参数,因此在输入参数的验证方面需要特别注意。可以使用第三方的输入参数验证库来简化验证逻辑,例如 joi
库:
-- -------------------- ---- ------- ----- --- - --------------- ----- ---------- - ------------ ----- ------------------------ ---- -------------------------------- --- --- --------- - -------- ----- ------- - ----- -- -- - ----- ---------------- - --------------------------- -- ------------------------ - ----- --- ------------------------------ - --- -- -
上述代码使用 joi
库定义了一个 UserInput
的验证器,并在 resolver 中进行验证。
总结
mutation 操作是 GraphQL Schema 中用于修改数据的操作。它包含了声明、resolver、参数、返回值和参数验证等多个特性。在实际项目开发中,我们需要合理地设计 mutation 操作,保证代码的可读性和可维护性,同时也需要注意输入参数的验证和错误处理等问题。
示例代码
-- -------------------- ---- ------- ---- ---- - ----- ------- ---- ---- ---------- ----- - ----- --------- - ----- ------- ---- --- - -- - ----- --------------- - --- --- ----- ------- ---- ---- - ---- -------- - -------------- ------------ ----- ----------------- ------------------ ----- -------------- ----- -------- - ----- --------- - - --------- - -------- ----- ------- - ----- -- -- - ----- ---- - --- ------------ ------ ------------ -- ----------- ----- ------- - ----- -- -- - ----- - --- ----- --- - - ------ ----- ---- - ----- ------------------ --------- - ----- -------- - ---- ------ ------------ -- ----------- ----- ------- - -- -- -- - ----- --------------------------- ------ ----- -- -- --
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648ffd3448841e9894e21e5a