如何使用 GraphQL 进行数据验证及解决常见问题

GraphQL 是一种由 Facebook 开发的数据查询和修改语言,它可以更加高效和灵活地查询和修改数据。在前端项目中,GraphQL 可以提供数据查询和修改的功能,并且通过将验证逻辑集成到 GraphQL Schema 中,可以实现数据验证的目的。本文将介绍如何使用 GraphQL 进行数据验证,并解决常见问题。

GraphQL 简介

GraphQL 是一种查询语言,它的主要特点有:

  • 灵活:通过 GraphQL 查询语句可以精确地指定需要查询的数据,可以避免传统 RESTful 接口中的“过度传输”问题。

  • 高效:GraphQL 可以减少不必要的网络请求,通过单一的 API 可以解决多个数据源的访问问题。

  • 安全:可以将验证操作集成到 GraphQL Schema 中,避免不可预测的行为。

GraphQL 的核心是查询语言(Query Language)和类型系统(Type System)。类型系统定义了一个 GraphQL Schema,可以控制执行时的查询类型和对数据进行验证的方式。

GraphQL 数据验证

对于任何 Web 应用程序,数据验证都是至关重要的。GraphQL 提供了在 Schema 级别上执行验证操作的机制,这为应用程序开发者带来了很大的便利。下面介绍 GraphQL 数据验证的两个主要方面:

输入类型检验

在 GraphQL 中,所有参数都是作为输入类型传递的,即使您在输入多个参数时,它们仍然被视为单个类型。这使得输入类型在 GraphQL 中非常重要。如果某个输入参数的类型不符合预期,则 GraphQL 会自动拒绝该请求。

例如,假设我们有一个 GraphQL 查询:

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

在这个查询中,我们期望 $id 参数是一个 ID 类型的值。如果我们传递了一个字符串,GraphQL 会自动拒绝该请求,并返回以下错误:

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

为了解决这个问题,我们可以在类型定义中添加一个输入类型的约束条件:

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

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

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

这个约束条件定义了一个名为 UserInput 的输入类型,该类型包含 id 和 name 两个属性。这个约束条件还要求 id 和 name 属性都不能为空。

数据验证

GraphQL Schema 除了是数据源的映射之外,还可以定义数据的验证规则。可以在 Schema 中使用自定义的验证程序来实现数据验证,并在查询和传递数据之前对数据进行验证。这样可以确保向数据库添加统一的数据。以下是一个示例:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上的例子给出了一些数据获取和修改的操作和验证。例如,在 AddUserInput 中,使用了约束条件来验证添加用户的输入信息,UpdateUserInput 和 DeleteUserInput 也有相应的验证。

常见问题解决

在使用 GraphQL 进行数据验证的过程中,会遇到一些常见问题。下面我们会介绍这些问题并提供相应的解决方案。

如何收集验证错误

例如,在添加用户时,可能会出现以下错误:

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

为了更好地理解检查到的错误,应将其收集在一个数组中,然后返回到请求中。下面的代码片段演示了如何在 GraphQL 中捕获错误和收集错误的方法。

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

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

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

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

这个例子中的 addUser 函数检查输入参数,并在创建新用户时发生错误时抛出 UserInputError 异常。在这种情况下,输入参数不能包含有效的 id 值。

如何执行异步验证

在某些情况下,数据验证可能需要异步执行。在这种情况下,可以使用 GraphQL 的托管程序机制。

以下代码片段演示在 GraphQL 中处理异步验证的示例:

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

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

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

-- ---

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

在这个例子中,addUser 函数异步调用 dataSources.userAPI.createUser(input) 并返回 userId。在没有 userId 的情况下,用户将抛出 UserInputError 异常。

如何验证嵌套对象

在 GraphQL 中,嵌套对象是常见的结构。可以使用 GraphQL 的类型系统来轻松地验证嵌套对象。

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

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

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

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

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

在这个例子中,嵌套的 AddressInput 与 CustomerInput 和 Customer 都简单地验证了它们所需要的所有属性。在 addCustomer 和 updateCustomer 函数中,可以对嵌套对象进行相同的验证。如果值不合法,可以抛出 UserInputError 异常来中断执行。

结论

GraphQL 提供了一种高效、灵活和安全的数据查询和修改方式,并通过将数据验证集成到表彰级别,帮助应用程序开发者更好地管理数据。在进行前端开发时,我们可以考虑使用 GraphQL,并结合上述技巧实现数据验证。

以上就是使用 GraphQL 进行数据验证及解决常见问题的详细介绍,希望对您有所帮助。

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