GraphQL 是一种用于 API 的查询语言。相对于 REST,它具有更好的灵活性和强大的功能,可以减少前后端开发间的沟通成本。而重要的是,GraphQL 还有着非常完善的类型系统,让我们能够在开发过程中更准确地表达 API 的数据结构。
在 GraphQL 中,可以自定义标量类型,以定义出符合自身业务逻辑的数据类型。而 graphql-tools
就是一个用于自定义 GraphQL Schema 的工具库。它提供了很多工具函数和模块,让我们可以方便地快速地构建一个符合我们需求的 GraphQL Schema。
而其中 graphql-tools-type-email
是一个用于自定义 Email 标量类型的 npm 包。它可以帮助我们快速地定义出一个 Email 类型,以便更好地验证与处理 GraphQL 中的邮件地址。下面,本文将介绍如何使用 graphql-tools-type-email
。
安装
我们可以直接使用 npm 进行安装:
npm install graphql-tools-type-email
使用
首先,我们需要引入一些必要的模块与函数:
const { makeExecutableSchema } = require('graphql-tools'); const { EmailAddress } = require('graphql-scalars'); const { EmailAddressType } = require('graphql-tools-type-email');
接着,我们需要定义一个 Schema String,里面包含我们自定义的 Email 类型:
-- -------------------- ---- ------- ----- -------- - - ------ ------------ ---- ----- - - --- - ---- -------- - - --- - --
接下来,我们可以使用 mergeTypes
函数来合并我们的 Schema String 与 EmailAddressType
,以方便我们引用:
const { mergeTypes } = require('merge-graphql-schemas'); const schema = makeExecutableSchema({ typeDefs: mergeTypes([typeDefs, EmailAddressType]), });
这里需要注意的是,我们必须在 schema 生成时使用 mergeTypes
将我们定义的 Email 类型与原有的 Schema String 合并,否则我们将无法使用 EmailAddress
标量类型。
详解
通过上述代码,我们成功定义出了一个 Email 类型。接下来,让我们详细地了解 graphql-tools-type-email
的各种参数和用法。
包导出的类型
graphql-tools-type-email
包导出了 EmailAddressType
和 EmailResolver
两个类型。其中 EmailAddressType
是用于自定义 Email 标量类型的,类似于 graphql-scalars
包导出的 EmailAddress
标量类型。而 EmailResolver
则是用于执行 Email 标量类型的解析函数的,可以自定义。
参数说明
EmailAddressType
&GraphQLScalarTypeConfig
:GraphQL 标量类型的配置项,用于定制标量类型的名称、解析值的方式等。name?: string
:标量类型的名称。默认为"EmailAddress"
。description?: string
:标量类型的描述。默认为"A field whose value conforms to the standard internet email address format as specified in RFC822: https://www.w3.org/Protocols/rfc822/."
。serialize?: GraphQLScalarSerializer<TSerialized>
:用于序列化值的函数。默认为EmailAddress.parseValue
。parseValue?: GraphQLScalarValueParser<TInternal>
:用于解析值的函数,将客户端传递的值解析为内部值。默认为EmailAddress.parseValue
。parseLiteral?: GraphQLScalarLiteralParser<TInternal>
:用于解析字面量的函数,将 GraphQL 查询中出现的字面量解析为标量类型的值。默认为EmailAddress.parseLiteral
。
其中,serialize
、parseValue
、parseLiteral
参数会在后面的小节中再作详解。
EmailResolver
format?: (email: string) => string
:用于执行 Email 标量类型的解析函数的回调函数。默认为email => email
,即默认原样返回传入的 Email。
serialize
参数
serialize
参数指定了如何将标量类型转换为 JSON 表示。一般来说,我们都可以直接沿用 graphql-scalars
包中的 serialize
函数:
-- -------------------- ---- ------- ----- - ---------------- - - ------------------------------------ ----- - ------------ - - --------------------------- ----- --------- - --- ------------------- -------------------- ---------------- - ------ ------------------------------ -- ---
parseValue
参数
parseValue
参数指定了如何将客户端传递的值解析为内部值。在 graphql-scalars
包中,一般也可以沿用 parseValue
函数:
-- -------------------- ---- ------- ----- - ---------------- - - ------------------------------------ ----- - ------------ - - --------------------------- ----- --------- - --- ------------------- -------------------- ----------------- - ------ ------------------------------- -- ---
parseLiteral
参数
parseLiteral
参数指定了如何将 GraphQL 查询中出现的字面量解析为标量类型的值。同样,在 graphql-scalars
包中,我们可以沿用 parseLiteral
函数:
-- -------------------- ---- ------- ----- - ---------------- - - ------------------------------------ ----- - ------------ - - --------------------------- ----- --------- - --- ------------------- -------------------- ----------------- - ------ ------------------------------- -- ---
EmailResolver
参数
EmailResolver
类型是一个回调函数,用于执行 Email 标量类型的解析。它可以接收客户端传递的值,进行处理并返回处理结果。默认情况下,它仅仅将传入的值原样返回。
-- -------------------- ---- ------- ----- - ------------- - - ------------------------------------ ----- - ---------------- - - --------------------------- ----- - ------------- - - ------------------- ----- -------- - - ------ ------------ ---- ----- - ------------ -------------- ------ - -- ----- --------- - - ------ - ------ -------- ----- -- ----------- -- -- ----- ------ - ---------------------- --------- --------------------- ------------------- ---------- - ------------- ------------- -------------- -- ---
在上面的代码中,我们可以通过 EmailAddress: EmailResolver
将 EmailResolver
回调函数添加到 GraphQL Schema 的解析函数中,从而让 Email 类型得到处理:
query { email(email: "foo@bar.com") # 返回 "foo@bar.com" }
当然,我们也可以自定义 Email 的解析方式:
-- -------------------- ---- ------- ----- - ------------- - - ------------------------------------ ----- - ---------------- - - --------------------------- ----- - ------------- - - ------------------- ----- ----------- - ------- -- -------------------------- ----- -------- - - ------ ------------ ---- ----- - ------------ -------------- ------ - -- ----- --------- - - ------ - ------ -------- ----- -- ----------- -- -- ----- ------ - ---------------------- --------- --------------------- ------------------- ---------- - ------------- ------------- - ----------------- ------- ------------ -- -- ---
在上述代码中,我们自定义了一个 formatEmail
函数,用于将传入的 Email 转为小写。同时,在 GraphQL Schema 的解析函数中通过 { ...EmailResolver, format: formatEmail }
引入了自定义的解析方式:
query { email(email: "FOO@BAR.COM") # 返回 "foo@bar.com" }
示例代码
-- -------------------- ---- ------- ----- - -------------------- - - ------------------------- ----- - ----------------- - - ------------------- ----- - ------------ - - --------------------------- ----- - ---------- - - --------------------------------- ----- - ----------------- ------------- - - ------------------------------------ ----- ----------- - ------- -- -------------------------- ----- -------- - - ------ ------------ ---- ----- - ------------ -------------- ------ - -- ----- --------- - - ------ - ------ -------- ----- -- ----------- -- -- ----- --------- - --- ------------------- -------------------- ---------------- - ------ ------------------------------ -- ----------------- - ------ ------------------------------- -- ----------------- - ------ ------------------------------- -- --- ----- ------ - ---------------------- --------- --------------------- ------------ ---------- - ------------- ------------- - ----------------- ------- ------------ -- -- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066b5a51ab1864dac66f19