GraphQL 是一种用于 API 的查询语言,它使得客户端能够精确地指定需要的数据,同时避免了不必要的数据传输。在开发 Web 应用时,我们通常会使用 GraphQL 作为前端与后端之间的通信协议,以便于数据的请求和响应。然而,在使用 GraphQL Mutation 进行数据的修改或创建时,我们可能会遇到返回类型不一致的问题,导致客户端无法正常解析数据。本文将详细介绍如何解决这一问题,并提供示例代码和指导意义。
问题描述
在 GraphQL Mutation 中,我们通常会使用 returning 关键字指定需要返回的数据,例如:
-- -------------------- ---- -------
-------- -
----------------- - ------ ------ ------- -------- ----- -- -- ----- ------ -- -
--------- -
--
-----
-------
----------
-
-
-上述 Mutation 的作用是创建一篇新的博客文章,并返回该文章的 ID、标题、内容以及创建时间。在大多数情况下,后端会根据 returning 中指定的字段返回对应的数据,因此客户端可以直接解析这些字段并使用它们。然而,有时候返回的数据并不会按照我们预期的格式进行返回,例如:
mutation {
createPost(input: { title: "Hello World", content: "This is my first post." }) {
id
title
content
created_at
}
}上述 Mutation 的 returning 关键字被省略了,因此后端将会按照默认的方式返回结果,可能并不包含我们指定的所有字段。此时客户端解析数据时就会发现返回的数据类型不一致,导致解析失败。
解决方案
为了解决 GraphQL Mutation 返回类型不一致的问题,我们可以使用以下两种方法:
方法一:指定默认返回值
在 GraphQL Schema 中,我们可以为 Mutation 类型指定一个默认的返回值类型,例如:
type Mutation {
createPost(input: PostInput!): Post!
@pgMutation(
mutationType: CREATE,
returning: { table: "posts", columns: ["id", "title", "content", "created_at"] },
defaultReturn: { id: 0, title: "", content: "", created_at: "" }
)
}如上所示,我们在 @pgMutation 中指定了 defaultReturn 属性,将其设为一个空的 Post 类型。这样,即使客户端没有指定 returning 关键字,后端仍然会按照指定的返回值类型返回数据,确保返回数据的格式是一致的。
方法二:使用 GraphQL Fragments
GraphQL Fragments 是一种用于定义可重用的字段集合的语法,可以帮助我们在不同的查询和 Mutation 中重复使用相同的字段,避免代码冗余。在解决返回类型不一致的问题时,我们可以将 returning 中的字段抽象成一个 Fragment,例如:
fragment PostFragment on Post {
id
title
content
created_at
}然后在 Mutation 中使用该 Fragment 来指定返回的数据类型,例如:
-- -------------------- ---- -------
-------- -
----------------- - ------ ------ ------- -------- ----- -- -- ----- ------ -- -
---------------
-
-
-------- ------------ -- ---- -
--
-----
-------
----------
-如上所示,我们在 Mutation 中使用 ...PostFragment 来指定返回的数据类型,确保客户端可以正确解析数据。
示例代码
为了帮助读者更好地理解解决方案,下面提供一个示例代码:
-- -------------------- ---- -------
---- -------- -
----------------- ------------ -----
------------------------- ------- ---------- - ------ -------- -------- ------ -------- ---------- ------------- --
-
---- ---- -
--- ---
------ -------
-------- -------
----------- -------
-如上所示,我们在 Mutation 中指定了需要返回的数据字段,使其与 Post 类型一致。
mutation {
createPost(input: { title: "Hello World", content: "This is my first post." }) {
id
title
content
created_at
}
}如上所示,我们在 Mutation 中指定了需要返回的数据字段,确保客户端可以正确解析数据。
-- -------------------- ---- -------
-------- -
----------------- - ------ ------ ------- -------- ----- -- -- ----- ------ -- -
---------------
-
-
-------- ------------ -- ---- -
--
-----
-------
----------
-如上所示,我们使用了 PostFragment 来指定需要返回的数据类型,确保客户端可以正确解析数据。
指导意义
通过上文的介绍,我们可以了解到解决 GraphQL Mutation 返回类型不一致的问题的两种方法:指定默认返回值和使用 GraphQL Fragments。使用这些方法可以确保我们在进行数据修改或创建时,能够正确地解析返回值,从而使得后续的数据操作更加高效和可靠。因此,在开发 Web 应用时,我们可以充分利用 GraphQL 的特点,通过合理地设计 GraphQL Schema 和使用相关的技术手段,使得前后端之间的通信更加顺畅和可控。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d8474da941bf7134ec3f62