GraphQL 是一种新兴的 API 设计语言,许多公司和开发者都开始尝试使用它来构建强大的 API。然而,在实际开发中,我们不仅需要编写 GraphQL schema,还需要将多个 schema 组合到一起。
npm 包 custom-merge-graphql-schemas 可以帮助我们解决这个问题,它允许我们使用自定义逻辑将多个 schema 合并成一个。
安装
我们可以通过 npm 进行安装:
npm install custom-merge-graphql-schemas
用法
使用 custom-merge-graphql-schemas 很简单,我们只需要编写一个 JavaScript 文件,将需要合并的 schema 导入到该文件中,并调用该包的合并函数即可。
下面是一个简单的示例:
-- -------------------- ---- ------- ----- - ----------- -------------- - - ---------------------------------------- ----- ---------- - ------------------------ ----- ---------- - ------------------------ ----- ------------- - --------------------------- ----- ----- - - -------------------- -------------------- ----------------------- -- ----- --------- - - --------------------- --------------------- ------------------------ -- ----- -------- - ----------------- - ---- ---- --- ----- --------- - -------------------------- ----- ------ - ---------------------- --------- ---------- ---
在上面的示例中,我们将三个 schema 分别导入到 userSchema、postSchema 和 commentSchema 中,然后使用 custom-merge-graphql-schemas 将它们合并成一个 schema。
需要注意的是,在调用 mergeTypes 和 mergeResolvers 函数时,我们需要将我们要合并的 schema 分别传递到这些函数中,并将它们的结果赋值给一个变量。在最后,我们将导出一个包含所有类型和解析程序的可执行 schema。
参数选项
在使用 custom-merge-graphql-schemas 时,我们可以使用一些可选参数进一步定制我们的合并逻辑。
all
默认情况下,mergeTypes 函数仅返回我们在 schema 中定义的类型。如果我们想要合并其他类型,可以将 all 参数设置为 true。例如:
const typeDefs = mergeTypes(types, { all: true });
exclusions
我们可以使用 exclusions 参数来指定我们要排除的类型,例如:
const typeDefs = mergeTypes(types, { exclusions: ['Query', 'Mutation', 'Subscription'] });
resolverValidationOptions
我们可以使用 resolverValidationOptions 参数配置自定义校验选项。
const resolvers = mergeResolvers(resolvers, { resolverValidationOptions: { requireResolversForResolveType: false }});
指导意义
custom-merge-graphql-schemas 使得 GraphQL schema 合并变得容易,并允许我们自定义合并逻辑。这对于实际的 GraphQL 项目非常有用,因为我们往往需要将多个 schema 组合到一起。
在实际使用中,我们需要根据项目需要灵活配置上述参数选项,从而获得更高的可维护性和更好的性能。
结论
custom-merge-graphql-schemas 是一个强大的 npm 包,能够帮助我们轻松地合并多个 GraphQL schema。在实际的 GraphQL 项目中,这是一个非常有用的功能,我们应该尝试使用该包。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60065f8a238a385564ab6dd5