GraphQL 中的 global ID 与 Node.js ID 映射

阅读时长 6 分钟读完

在 Web 开发中,常常需要在不同环境中传递 ID,但传输不同的 ID 或使用错误的 ID 格式会导致异常和错误,增加代码实现和维护的难度。GraphQL 提供了一个解决方案——global ID。

什么是 global ID

global ID 是一种全局唯一的 ID 格式,由两部分组成:类型标识符(type prefix)和相对 ID(relative ID)。其中类型标识符代表对象的类型,相对 ID 是对象在该类型下的唯一标识符。

例如,在一个博客系统中,global ID 可以表示为 BlogPost:1,其中 BlogPost 代表对象类型,1 代表对象 ID。

以这种方式生成 global ID 意味着可将对象 ID 从 Node.js 端显式地展示到客户端,避免了 ID 转换带来的错误和异常,同时保证了在所有支持 GraphQL 的语言和库中的唯一识别。

如何生成 global ID

GraphQL.js 提供了 toGlobalId 函数来生成 global ID。它的参数有两个:type prefix 和相对 ID。在 Node.js 中,通常使用数据库给出的 ObjectID 作为相对 ID。

如何将 global ID 转为 Node.js ID

在服务器端,需要将 global ID 转换为 Node.js ID。GraphQL.js 提供了 fromGlobalId 函数,可以将 global ID 解码为包含类型和相对 ID 的对象。通过 type 属性,可以判断出对象类型,从而在数据库中查询对应对象。

如何使用 global ID

通过 Relay,GraphQL.js 提供了更好的支持,可以轻松处理全局 ID。例如,在查询中使用 global ID 代替对象 ID。

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

查询结果:

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

通过 nodeDefinitions,可以根据 global ID 快速地查询对象。

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

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

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

在定义 Type 的时候,通过实现 nodeInterface,可以将对象转换为具有 nodenodes 字段的 GraphQL 类型。

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

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

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

总结

使用 global ID 可以避免 ID 转换带来的错误和异常,同时保证在所有支持 GraphQL 的语言和库中的唯一识别。在 Node.js 中,使用 toGlobalId 生成 global ID,在服务器端使用 fromGlobalId 将 global ID 转换为 Node.js ID。通过 nodeDefinitions,可以根据 global ID 快速地查询对象。通过实现 nodeInterface,可以将对象转换为具有 nodenodes 字段的 GraphQL 类型。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e6c3cff6b2d6eab321d98c

纠错
反馈