前言
在GraphQL开发中,合并多个 schema 是一个极为常见的需求,因此市面上有许多解决方案。其中,@graphql-toolkit/schema-merging 是一个非常流行的包,其提供了一种优雅且灵活的合并 schema 的方式。
本文将结合实际示例详细介绍如何使用 @graphql-toolkit/schema-merging,希望能对初学者有所帮助。
安装
在使用之前,我们需要通过 npm 安装 @graphql-toolkit/schema-merging:
npm install @graphql-toolkit/schema-merging
示例
下面将结合两个示例来介绍使用 @graphql-toolkit/schema-merging 的方法。
简单合并
我们有两个 schema,一个定义了 Query 类型,一个定义了 Mutation 类型:
-- -------------------- ---- ------- -- --------------- ---- ----- - ------ ------- - -- --------------- ---- -------- - ---------------------- --------- ------- -
要将这两个 schema 合并,我们需要创建一个合并器:
const { mergeTypeDefs } = require('@graphql-toolkit/schema-merging'); const { readFileSync } = require('fs'); const schema1 = readFileSync('./schema1.graphql', 'utf-8'); const schema2 = readFileSync('./schema2.graphql', 'utf-8'); const mergedSchema = mergeTypeDefs([schema1, schema2]);
这样,我们就得到了一个新的 schema,它将 Query 和 Mutation 两个类型合并在了一起。
带指令的合并
在上一个示例中,我们只是简单地将两个 schema 合并了起来。在实际项目中,我们可能需要对合并的过程进行更复杂的操作。
例如,我们需要对 Mutation 中的 updateMessage 操作进行限制,只有拥有指定权限的用户才能执行该操作。为了实现这样的功能,我们可以定义一个指令来实现这个限制:
directive @hasRole(role: String!) on FIELD_DEFINITION type Mutation { updateMessage(message: String!): String! @hasRole(role: "admin") }
我们将这个指令定义在 schema3.graphql 中,然后将其和之前的两个 schema 合并:
-- -------------------- ---- ------- ----- - ------------- - - ------------------------------------------- ----- - ------------ - - -------------- ----- ------- - --------------------------------- --------- ----- ------- - --------------------------------- --------- ----- ------- - --------------------------------- --------- ----- ------------ - ----------------------- -------- --------- - ----------- ----------- ----------- ------------------ ----- ---
在合并的过程中,我们可以通过 options 对象来配置一些选项:
exclusions
:排除不需要合并的内容。reverseDirectives
:如果为 true,指令将在合并过程中颠倒顺序。
通过配置选项,我们将 directive @hasRole
排除在了合并过程之外。
总结
本文介绍了如何使用 @graphql-toolkit/schema-merging,在实际项目中,@graphql-toolkit/schema-merging 可以减少代码冗余,提高开发效率,同时也提供了一些方便的选项,帮助开发者更加灵活地合并 schema。
希望本文能够对初学者有所帮助。更多内容,请查看@graphql-toolkit/schema-merging 的官方文档。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/192789