GraphQL(Graph Query Language)是一种用于 API 开发的查询语言,它不仅可以获取数据,还可以精准地控制数据的返回。在使用 GraphQL 进行数据查询时,经常会遇到数据类型转换的情况,本文旨在介绍 GraphQL 中数据类型转换的技巧及注意事项,并给出示例代码帮助读者掌握实际应用。
1. 基本数据类型转换
GraphQL 默认支持以下标量类型:Int、Float、String、Boolean、ID。当接口或数据源中的数据类型与 GraphQL 的标量类型不一致时,需要进行数据类型转换。以下是一些常见的类型转换示例:
-- -------------------- ---- ------- ---- ----- - -------- ---- ---- - ---- ---- - --- -- ----------- ------ ---------- ------ ---- --- - ---- ------- - --- ------- ------ ------ ----- ------ ---- ------- - ---- ------------ - ------ - ----- -------- - -- -- - ----------- -- -- - ----- ---- - ------------------------------------ ------ - --- ------------------- ----------- ----------- ---------- ---------- ---- ------------------ -- - - -
在上面的示例中,我们定义了一个 userAPI
,它返回的数据类型为 UserAPI
。但是在 GraphQL 的 User
中,我们使用了 ID
和 Int
类型,这时候需要进行类型转换。具体来说,我们将 UserAPI.id
转换为 ID
类型,String 类型的 UserAPI.first
和 UserAPI.last
转换为 String
类型的 User.first_name
和 User.last_name
,将 UserAPI.age
转换为 Int
类型的 User.age
。
另外,在进行类型转换时,需要注意避免产生不必要的错误。例如在上述示例中,如果 userAPI
中的 age
字段返回的是一个字符串而不是一个整数,那么在调用 parseInt()
时就会产生错误,因此我们应该在数据源中保证返回的数据类型正确无误。
2. 枚举类型转换
在 GraphQL 中,我们可以自定义枚举类型,例如:
-- -------------------- ---- ------- ---- ----- - --- ----- ---- - ---- ----- - --------------------- ------- --------- - ---- ------- - ----- ------ ------ ----- - ---- ---------- - ----- ------ ------ ------ - ---- --------------- - ------ - --------------- -------- - ----- -- - ----------- -- -- - ----- -------- - ------------------------------------------------- ------ -------------------- -- -- ----- ------------- ------ ---------------------------------- ---- - - -
在上面的示例中,我们定义了一个枚举类型 Color
,用于过滤产品数据。在 ProductResolver
中,我们从 productAPI
中获取数据并返回,这时候需要将 ProductAPI.color
转换为 Product.color
。具体来说,我们使用 Color[product.color.toUpperCase()]
将 ProductAPI.color
转换为 Color
类型的枚举值。
需要注意的是,在进行枚举类型转换时,应该保证传入的值是正确的枚举值,否则可能会产生无法预料的错误。例如如果 productAPI
中的 color
字段返回的是一个不存在的枚举值,那么调用 Color[product.color.toUpperCase()]
时就会返回 undefined,从而导致其他错误。
3. 自定义类型转换
在 GraphQL 中,我们可以自定义类型,例如:
-- -------------------- ---- ------- ---- ----- - ------------ ---- ---- - ---- ---- - --- -- ----- ---- - ---- ---- - ------ ------ ----- ------ - ---- ------- - --- ------- ------ ------ ----- ------ - ---- ------------ - ------ - --------- -------- - -- -- - ----------- -- -- - ----- ---- - ------------------------------------ ------ - --- ------------------- ----- - ------ ----------- ----- --------- - -- - - -
在上面的示例中,我们定义了一个自定义类型 Name
,用于存储用户的名字。在 UserResolver
中,我们从 UserAPI
中获取数据,并将其转换为 GraphQL 自定义类型。具体来说,我们将 UserAPI.first
和 UserAPI.last
转换为 Name.first
和 Name.last
,然后将其赋值给 User.name
。
在进行自定义类型转换时,应该保证自定义类型与数据源中的数据类型匹配,否则可能会产生数据不一致的结果。例如如果 UserAPI.first
或 UserAPI.last
返回的是空字符串,而在 Name.first
或 Name.last
中定义了不能为空的校验,那么就会产生错误。
结论
在 GraphQL 中进行数据类型转换时,需要注意以下事项:
- 避免类型转换错误引起的不必要的错误;
- 保证传入的枚举值是正确的;
- 在自定义类型中保证数据源的数据类型与 GraphQL 自定义类型匹配。
我们希望通过本文的介绍,能够帮助读者掌握 GraphQL 中的数据类型转换技巧及注意事项,并在实际应用中更加熟练地处理数据类型转换问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6704c5bcd91dce0dc8502aa1