GraphQL 是一种用于 API 的查询语言和运行时,GraphQL 旨在让 API 更加高效、强大和易于使用。而 graphql-transform-schema 是一个 npm 包,用于操作 GraphQL 接口的 schema。
本文将详细介绍 graphql-transform-schema 的使用方法,包括安装、基本使用以及实际应用场景。
安装
在终端中输入如下命令进行安装:
npm install graphql-transform-schema
提醒:使用该包之前必须了解 GraphQL 基础知识。
基本使用
引入包
在使用之前,需要先引入 graphql-transform-schema 包,可以使用以下方式:
const { Transform } = require("graphql-transform-schema");
实例化
实例化 Transform 对象时需要传入一个对象作为参数。该对象中包含了需要进行的转换过程。
const transform = new Transform({ schema, transforms });
其中,schema 是 GraphQL schema 对象,transforms 是 Transform 对象数组。可以使用以下代码生成 schema 对象:
const { buildSchema } = require("graphql"); const schema = buildSchema(` type Query { hello: String } `);
甚至也可以从一个 GraphQL 文件中加载 schema,如下所示:
const { makeExecutableSchema } = require("graphql-tools"); const { loadFilesSync } = require("@graphql-tools/load-files"); const { mergeTypeDefs } = require("@graphql-tools/merge"); const typesArray = loadFilesSync("./graphql/*.graphql"); const schema = makeExecutableSchema({ typeDefs: mergeTypeDefs(typesArray), });
而 transforms 数组中可以包含多个转换类型。例如:
-- -------------------- ---- ------- ----- - ------------------------ ------------ ------------------------ - - ------------------------------ ----- ---------- - - --- -------------------------- --- ------------------ -- -------------- --- -------------------------------------- -- - ----- - ---- - - ------------ -- ----- ---------- ------------------ - ------------------- - ----- -------- ----- -------- ----- -- - ----- ------ - ----- -------------------- ----- -------- ------ ------ - ------ ------ -- -- - --- --
在上述代码中,将 AddArgumentsAsVariables、RenameTypes 和 TransformCompositeFields 三个转换类型放在同一个数组中。其中,AddArgumentsAsVariables 是将变量分解为参数输入。例如:
query hello($name: String!) { hello(name: $name) }
转换为:
query hello($name: String!) { hello(name: $name) }
而 RenameTypes 是用于修改类型名。例如:
type Hello { name: String }
转换为:
type My_Hello { name: String }
而 TransformCompositeFields 是用于修改字段。例如:
type Query { hello: Hello }
转换为:
type Query { hello: HelloOutput }
其中 HelloOutput 的字段 value 包含了原来的 Hello 对象。同时,也可以在 resolveField 函数中对字段的返回值进行转换和处理。
实际应用场景
实际应用场景中,graphql-transform-schema 可以用于对输入的 GraphQL 请求进行修改和校验。例如:
-- -------------------- ---- ------- ----- ------ - ------------- ---- ---- - --- ------ ----- ------ ---- --- - ---- ----- - ---------- -------- ---- ----- ------- -------- ---- - --- ----- ---------- - - --- -------------------------- --- --------------- ------ -------- ------- --- --- ------------------------- ----------------- ---------- ---------- ------ -- ---------- --- --------- --- --- ------------------ -------- ------- ------- ---- -- - -- ---- --- ------ - ---------- - --- --------------------------- - ------ ------ - -- -- ----- --------- - --- ----------- ------- ----------- --- ----- ----- - - ----- ------- -------- ----- ------ ---------- ------ ---- ----- ------- ------- - -- ---- --- - - -- ----- --------- - - ----- ------ ---- --- -- ----- - ------ --------- ---------- ------------ - - -------------------------- -----------
在上述代码中,通过 AddArgumentsAsVariables 将变量拆分为参数,然后通过 KeepArguments 保留 name 和 age 两个参数,过滤掉了 gender。接着使用 FilterInputObjectFields 将 gender 从输入中过滤掉,最后通过 ReplaceFieldInput 修改了 age 参数的类型,将 age 参数变为了必填项。
通过以上步骤的转换,得到的新的 GraphQL 请求如下:
query ($name: String!, $__a0: Int!){ user(name: $name, age: $__a0) { id name age } }
其中,age 变为了必填项。在开始解析 GraphQL 请求时,应该根据新的 GraphQL 请求来进行解析。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005663781e8991b448e2302