如何在 GraphQL 中使用和扩展自定义标量类型

GraphQL 作为一种查询语言和执行引擎,可以用于任何类型的应用程序,尤其是Web应用程序。您可以使用不同的客户端和服务器库来支持 GraphQL。在实际开发中,GraphQL 是一种很流行的解决方案,由于其优异的性能和灵活性,越来越多的公司和组织将其用于项目中。

GraphQL 支持内置数据类型和自定义数据类型。在 GraphQL 中,自定义标量类型(Custom scalar)是一种独立的数据类型,可以通过编写自定义解析器来扩展 GraphQL 数据类型系统。标量类型是一种原始数据类型,表示数据的基本类型,例如字符串、整数、浮点数和布尔值。

在本文中,我们将向您介绍在 GraphQL 中如何使用和扩展自定义标量类型,并提供示例代码,以便更好地理解。

使用自定义标量类型

使用自定义标量类型非常简单。我们只需要将自定义标量类型的名称添加到我们的GraphQL类型声明中即可。以下是添加自定义标量类型的 GraphQL类型声明示例:

------ -------
---- ----- -
   ------------- --------- ------
-

上面的代码片段中,我们通过添加 ISODate 标量类型在查询中添加了一个名为 example 的字段并指定日期参数,该日期参数采用 ISODate 自定义标量类型作为参数类型。

在使用自定义标量类型时,在 GraphQL schema 中必须定义解析器以将自定义类型转换为实际类型。下面是定义自定义日期类型解析器的示例:

----- --------- - -
  -------- --- -------------------
    ----- ----------
    ---------------- -
      -- ---------
      ------ --------------------
    --
    ----------------- -
      -- -----
      ------ --- ------------
    --
    ----------------- -
      -- --------- --- ------------ -
        -- -------
        ------ --- ----------------
      -
      ------ -----
    --
  ---
--

上述解析器中所涉及的三种方法是标量类型应该实现的三种方法:serializeparseValueparseLiteral。这些方法分别用于序列化、解析输入值以及解析 AST 节点(AST 是一个 JavaScript 对象,描述了 GraphQL 查询语句的结构和内容)。

扩展自定义标量类型

在 GraphQL 中扩展现有的自定义标量类型或创建新的自定义标量类型非常容易。我们可以直接在我们的 GraphQL schema 中定义并向解析器添加一个标量类型。

以下是如何扩展日期类型的示例:

------ ----

------ ---- ----- -
  ----------------- ------ ------
-

----- --------------- - -
  ----- --- -------------------
    ----- -------
    ---------------- -
      -- --------
      ------ --------------------
    --
    ----------------- -
      -- -----
      ------ --- ------------
    --
    ----------------- -
      -- --------- --- ------------ -
        -- -------
        ------ --- ----------------
      -
      ------ -----
    --
  ---
--

上述代码中,我们使用 extend 操作符来添加新的 Date 标量类型,并使用新的解析器来扩展它。然后我们使用这个新的标量类型在查询中添加了一个新的名为 exampleDate 的字段。

综合示例

我们来看下一个综合的自定义标量类型的示例。假设我们想在 GraphQL schema 中添加自定义标量类型 Contact,表示联系方式,包括电子邮件和电话号码。

以下是我们的 GraphQL schema:

------ -------

---- ----- -
  ----- ------
  --------------------------- --------- ------
-

现在我们需要添加一个新的标量类型 Contact 并在解析器中实现序列化和解析方法。

----- --------- - -
  -------- --- -------------------
    ----- ----------
    ---------------- -
      ------ ------ -- ------
    --
    ----------------- -
      -- --------------------- -- --------------------- -
        ------ ------
      -
      ----- --- -------------- ------- --------------
    --
    ----------------- -
      -- --------- --- ------------ -
        ----- ----- - ----------
        -- --------------------- -- --------------------- -
          ------ ------
        -
        ----- --- -------------- ------- --------------
      -
      ------ -----
    --
  ---
  ------ -
    ----- -- -- ----- -----
    ------------------- -------- ----- -- -
      ------ ----- ------- ----------- -- -----------------
    --
  --
--

-- -- ----- --------
-------- -------------------- -
  -- ----
  ------ -----
-

-------- -------------------- -
  -- ----
  ------ -----
-

我们在 parseValueparseLiteral 方法中添加了一个验证逻辑,用于检查传入的联系方式是否有效。如果联系方式有效,则可以将其传递给下游 GraphQL 服务。

结论

在 GraphQL 中使用和扩展自定义标量类型非常简单。您只需要将自定义标量类型的名称添加到GraphQL类型声明中,然后定义解析器来将自定义类型转换为实际数据类型即可。在解析器中,您需要实现三种方法:serializeparseValueparseLiteral,以序列化和解析输入值和 AST 节点。

自定义标量类型可以帮助您更轻松地处理查询和返回数据,并提供更好的类型检查和错误处理。通过使用自定义标量类型,您可以扩展GraphQL 默认的类型系统,使其更适合您的应用程序。

本文为您提供了如何在GraphQL 中使用和扩展自定义标量类型的完整解释和示例代码。我们希望这篇文章对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6735f48f0bc820c582516897