在 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。
const { toGlobalId } = require('graphql-relay'); const globalId = toGlobalId('BlogPost', '6040e3716240c8d5ae09ba02'); console.log(globalId); // "QmxvZ1Bvc3Q6NjA0MGUzNzE2MjQwYzhkNWFlMDliYTAy"
如何将 global ID 转为 Node.js ID
在服务器端,需要将 global ID 转换为 Node.js ID。GraphQL.js 提供了 fromGlobalId
函数,可以将 global ID 解码为包含类型和相对 ID 的对象。通过 type
属性,可以判断出对象类型,从而在数据库中查询对应对象。
const { fromGlobalId } = require('graphql-relay'); const { type, id } = fromGlobalId('QmxvZ1Bvc3Q6NjA0MGUzNzE2MjQwYzhkNWFlMDliYTAy'); console.log(type); // "BlogPost" console.log(id); // "6040e3716240c8d5ae09ba02"
如何使用 global ID
通过 Relay,GraphQL.js 提供了更好的支持,可以轻松处理全局 ID。例如,在查询中使用 global ID 代替对象 ID。
-- -------------------- ---- ------- ----- - -------- ----------------------------------------------- - -- ----- ------- ------ - -- ---- - - -
查询结果:
-- -------------------- ---- ------- - ------- - ------- - ----- ----------------------------------------------- -------- --- ------ ---------- ------- -------- --------- - ----- --------------- ------- ------ - - - -
通过 nodeDefinitions
,可以根据 global ID 快速地查询对象。
-- -------------------- ---- ------- ------ - ---------------- ------------ - ---- ---------------- ------ - ----------- - ---- -------------- ----- - ---------- ----------- ------------- - - ---------------- ---------- -- - ----- - ----- -- - - ----------------------- -- ----- --- ----------- - ------ ---------------- - -- ----- -- - -- ---- ---------- --------- - ------ ----------- - --- ------ - ---------- ----------- ------------- --
在定义 Type 的时候,通过实现 nodeInterface
,可以将对象转换为具有 node
和 nodes
字段的 GraphQL 类型。
-- -------------------- ---- ------- ------ - ------------------ --------------- ------------- - ---- ---------- ------ - ------------- - ---- ---------------- ------ - ------------- - ---- --------- ----- ------------ - --- ------------------- ----- ----------- ----------- ---------------- ------- -- -- -- --- -------------------------- ------ - ----- --- ------------------------------ -- -------- - ----- --- ------------------------------ -- ------- - ----- --- ------------------------- -------- ----- -- ---------------------- -- --- --- ------ - ------------ --
总结
使用 global ID 可以避免 ID 转换带来的错误和异常,同时保证在所有支持 GraphQL 的语言和库中的唯一识别。在 Node.js 中,使用 toGlobalId
生成 global ID,在服务器端使用 fromGlobalId
将 global ID 转换为 Node.js ID。通过 nodeDefinitions
,可以根据 global ID 快速地查询对象。通过实现 nodeInterface
,可以将对象转换为具有 node
和 nodes
字段的 GraphQL 类型。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e6c3cff6b2d6eab321d98c