GraphQL 是一种用于 API 的查询语言,它可以把多个数据源(如数据库、REST API 等)整合到一个 API 中,提供给前端开发人员调用。而 @graphql-tools/stitch 就是一个优秀的 npm 包,用于不同 GraphQL API 的整合,本文将为大家介绍它的使用方法。
为什么要使用 @graphql-tools/stitch?
在使用 GraphQL 进行服务端开发时,我们可能会遇到这样的情况:需要对不同的数据源进行查询,但是每个数据源对应的 Schema 是不同的,此时我们可以使用 @graphql-tools/stitch 来整合这些 Schema,从而减少代码的复杂度。
而且,@graphql-tools/stitch 还提供了对 Schema 的本地化和查询计划的缓存功能,从而加快了查询速度,减少了请求次数和网络带宽的消耗。
如何使用 @graphql-tools/stitch?
安装
使用 npm 进行安装:
npm i @graphql-tools/stitch
准备工作
首先,我们需要准备好要整合的不同 Schema。本文为了方便演示,我们假设有 2 个 Schema,分别是 User 和 Order。
我们先定义 User 的 Schema:
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- ------ ------- - ---- ----- - ------ -------- -
然后定义 Order 的 Schema:
-- -------------------- ---- ------- ---- ----- - --- --- ------- --- -------- ------- ------ ------ - ---- ----- - ------- --------- -
整合 Schema
接下来,我们将这两个 Schema 整合起来。首先,我们需要安装一下 graphql:
npm i graphql
1、定义 Schema
我们在一个新的文件里定义整合后的 Schema:
-- -------------------- ---- ------- ------ ---- ----- - ------ -------- ------- --------- - ------ ---- -------- - ---------------- -------- ------ --------- ----- - ---- ------ - -------- ----- ----- -------------- ----- --------- - ---- ---- - --- --- ----- ------- ------ ------- ------- --------- - ---- ----- - --- --- ------- --- -------- ------- ------ ------ ----- ----- -
这里,我们通过 extend
关键字,将 User 和 Order 这两个 Schema 合并到了一个新的 Schema 中。
需要注意的是,我们为 Stitch 定义了一个新的类型,用于处理不同 Schema 的整合。同时,我们为 User 和 Order 加上了新的字段,以便能够进行跨 Schema 的查询。
在这个新的 Schema 中,我们定义了查询接口 Query,包括了 users 和 orders 两个查询字段,以及一个 createUser 的 mutation 接口。
2、创建 Schema 和 Resolver
接下来,我们需要创建 Schema 和 Resolver。
首先,我们在一个新的文件里创建 Schema:
-- -------------------- ---- ------- ----- - -------------------- - - --------------------------------- ----- -------- - -- --------- ------- ----- ------ - ---------------------- --------- --- -------------- - -------
然后,我们在另一个文件中创建 Resolver:
-- -------------------- ---- ------- ----- - ---------------- - - ----------------------------------- ----- - ------------- - - --------------------------------- ----- - ----------------- ----------- ------------ - - ------------------------- ----- - -------------------------- - - --------------------------------- ----- ---------- - -- ---- ------- ----- ----------- - -- ----- ------- ----- -------------- - ---------------------------- ------- ----------- --- ----- --------------- - ---------------------------- ------- ------------ --- ----- ------------ - --------------- ----------- - - ------- -------------- -- - ------- --------------- -- -- --------- --- ----- --------- - - ------ - ------ ------ ----- -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- -------- ----- -------- ----- --- -- ------- ------ ----- -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- --------- ----- -------- ----- --- -- -- ------- - ----- ------ -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- -------- ----- - --- -------- -- -------- ----- --- -- ------- ------ -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- --------- ----- - ------- ------------ -- -------- ----- --- -- -- ----- - ------- ------ ----- -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- --------- ----- - ------- -------- -- -------- ----- --- -- -- ------ - ----- ------- ----- -------- ----- -- - ------ ------------------ ------- ------------- ---------- -------- ---------- ------- ----- - --- ------------- -- -------- ----- --- -- -- --------- - ----------- ------ ----- -------- ----- -- - ------ ------------------ ------- ------------- ---------- ----------- ---------- ------------- ----- -------- ----- --- -- -- -- ----- ------ - ------------ ------- ------------- ----------- --- --- -------------- - -------
这里,我们先将 User Schema 和 Order Schema 转换成可执行的远程 Schema,然后使用 stitchSchemas
将它们整合。接着,我们定义了 Query 和 Mutation 的 Resolver,用于实现查询和修改操作。
在 Resolver 中,我们将 Stitch 定义的类型映射到了对应的 Schema 中,并通过 delegateToSchema
方法来调用对应 Schema 的查询接口或 mutation 接口,从而实现了整合。
测试
最后,我们可以使用一个 GraphiQL 界面来测试我们的 wholeSchema,示例如下:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- ------ - -------------------- ----- --- - ---------- ------------------- ------------- ------- --------- ----- ---- ----- ---- - ---------------- -- ----- ---------------- -- -- - ------------------- -- ------- -- ---- ---------- ---
到这里,我们已经完成了整个代码的演示,大家可以根据自己的实际需求进行调整和修改。
总结
本文介绍了如何使用 @graphql-tools/stitch 来整合多个 GraphQL Schema,从而加快了查询速度、减少了请求次数和网络带宽的消耗。希望对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedc8a5b5cbfe1ea0612317