在 GraphQL 中使用 Mutation 进行数据修改的技巧和最佳实践

GraphQL 是一种用于 API 的查询语言,它可以让客户端定义数据的结构,以及需要返回的数据。Mutation 是 GraphQL 中用于修改数据的关键字,它可以让客户端修改数据,而不需要直接调用后端 API。

在本文中,我们将探讨在 GraphQL 中使用 Mutation 进行数据修改的技巧和最佳实践。我们将介绍如何定义 Mutation,如何处理错误,以及如何处理异步操作。

定义 Mutation

在 GraphQL 中,Mutation 是用于修改数据的关键字。我们可以使用它来定义需要修改的数据,并返回修改后的结果。

下面是一个简单的 Mutation 示例:

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

这个 Mutation 定义了一个 updateUser 操作,它接受一个 id 和一个 name 参数,并返回一个包含 id 和 name 字段的对象。

在后端实现时,我们需要定义一个 updateUser 函数来处理这个 Mutation。这个函数需要接受一个包含参数的对象,并返回一个包含修改后的数据的对象。

下面是一个使用 Node.js 和 GraphQL.js 实现 updateUser 函数的示例:

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

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

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

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

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

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

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

这个示例使用 buildSchema 函数定义了一个包含 updateUser Mutation 的 GraphQL schema。然后定义了一个 users 数组来存储用户数据,并实现了 updateUser 函数来修改用户数据。

最后,我们使用 graphql 函数来执行 updateUser Mutation 并打印结果。

处理错误

在实际开发中,我们需要处理各种错误,例如用户输入无效数据、数据库操作失败等。在 GraphQL 中,我们可以使用 Error 类型来表示错误,并在 Mutation 中返回它们。

下面是一个处理错误的示例:

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

这个 Mutation 尝试将 id 为 123 的用户的名称更新为空字符串。由于这是一个无效的操作,我们需要返回一个错误。

下面是一个使用 Node.js 和 GraphQL.js 处理错误的示例:

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

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

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

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

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

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

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

这个示例使用 GraphQLError 类型来表示错误,并在 updateUser 函数中检查参数是否有效。如果参数无效,我们将抛出一个 GraphQLError。

处理异步操作

在实际开发中,我们通常需要进行异步操作,例如调用后端 API 或操作数据库。在 GraphQL 中,我们可以使用 Promise 来处理异步操作。

下面是一个处理异步操作的示例:

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

这个 Mutation 尝试将 id 为 123 的用户的名称更新为 "John Smith"。由于这是一个异步操作,我们需要返回一个 Promise。

下面是一个使用 Node.js 和 GraphQL.js 处理异步操作的示例:

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

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

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

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

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

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

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

这个示例使用 Promise 来处理 updateUser 函数的异步操作。我们使用 setTimeout 模拟一个异步操作,然后在 resolve 或 reject 中返回结果。

结论

在 GraphQL 中使用 Mutation 进行数据修改可能比直接调用后端 API 更加方便和灵活。在本文中,我们介绍了如何定义 Mutation,如何处理错误,以及如何处理异步操作。这些技巧和最佳实践可以帮助我们更加高效地使用 Mutation。

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