GraphQL 是一种用于 API 的查询语言和运行时的环境,常常用于构建 Web 应用程序的服务端。它的一个重要特点是可以通过定义 Schema 来指定数据模型和查询字段,并在客户端请求数据时提供强类型的查询。然而,在很多应用场景中,我们需要动态地向 Schema 中添加字段。随着 GraphQL 不断发展,新的扩展机制也应运而生。本文希望介绍 GraphQL 的扩展机制,并详细探讨如何为 Schema 动态添加字段。
扩展 Schema 的两种方法
GraphQL 中基本的 Schema 是由 Query 和 Mutation 两个根类型组成,其中 Query 类型描述了查询的入口点,Mutation 类型用于处理修改操作。在现有的 Schema 中添加字段可以通过两种方法实现:使用 extend
关键字或者使用 GraphQLSchema.extend
方法。
使用 extend
关键字
extend
关键字可以用于扩展现有类型,也可以用于创建新的类型。使用 extend
扩展现有类型的方法,如下所示:
extend type Query { newField: String! }
这个语句表示在 Query 中添加了一个新的字段 newField
,该字段返回的是一个非空字符串。需要注意的是,如果 Schema 中已经定义了一个名为 newField
的字段,则会出现重复定义的错误。
使用 GraphQLSchema.extend
方法
GraphQL JS 库为我们提供了一个 GraphQLSchema
类,它包含了许多有用的方法,比如 extend
方法,可以用于扩展现有的 Schema 实例。以下是使用 GraphQLSchema.extend
方法定义一个新的 Schema 实例:
-- -------------------- ---- ------- ------ - ------------- - ---- ---------- ----- ------ - --- --------------- ------ ------------ --- ----- --------- - --------------- --------- --------------- ---
这个代码片段中,首先创建了一个包含 MyQueryType
的 GraphQLSchema
实例,然后通过 extend
方法将 MyMutationType
添加到新的 Schema 实例中。
为 Schema 添加字段时需要注意的事项
除了以上两种方法,还需要注意一些其他的事项和限制。
字段名称和类型的检查
当 Schema 中已经定义了一个名为 field
的字段时,如果尝试添加一个相同名称的字段,会导致重复定义的错误。因此,为了避免这种情况,我们需要在添加新字段时使用唯一的名称。同样,在添加新的字段时需要确保它的类型与现有的类型匹配。如果类型不匹配,则会出现类型错误。这些错误都可以在运行时检测到。
枚举类型的检查
添加枚举类型的时候,需要确保枚举值唯一。如果枚举值不唯一,则会出现重复定义的错误。另外,枚举值的名称必须是有效的变量名称,也就是说不能以数字开头,也不能包含特殊字符。以下是一个有效的枚举值的示例:
enum Color { RED BLUE }
处理模式的变动
对于已经在生产中使用的 Schema,任何模式变动都需要做好充分的测试和准备。如果添加了新的字段,需要确保查询中使用的所有字段都能正常工作,并且不存在任何兼容性问题。
如何为 Schema 添加字段
下面是一个使用 extend 关键字扩展 Query 的例子:
extend type Query { user(id: ID!): User! } type User { id: ID! name: String! }
在这个例子中,我们扩展了 Query 类型,添加了一个查询用户信息的接口。接收一个非空的 ID,返回一个 User 类型的对象。
下面是在 NodeJS 中为 Schema 扩展 Mutation 的例子:
-- -------------------- ---- ------- ----- - ------------------ -------------- --------------- - - ------------------- ----- -------------- - - ----------- - ----- --- ------------------------------ ----- - ----- - ----- --- ----------------------------- -- --------- - ----- --- ----------------------------- -- -- -------- --- - ----- -------- -- -- - -- ------- ------ ---------- -- -- -- ----- ------------ - --- ------------------- ----- ----------- ------- --------------- --- ----- --------- - --------------- --------- ------------ ---
在这个例子中,我们定义了一个 createUser
的 Mutation 操作,该操作接收一个名为 name 和一个名为 password 的非空字符串作为输入参数。在 resolve 函数中可以编写如何创建用户的逻辑,并返回一个字符串,以表示操作成功或失败。最后,我们使用 extend
将 MutationType 添加到现有的 Schema 实例中。有了这个新的 MutationType,就可以在客户端发送带有 createUser
的 Mutation 操作请求了。
总结
本文介绍了 GraphQL 的两种 Schema 扩展方法:使用 extend
关键字和 GraphQLSchema.extend
方法,以及添加字段时需要注意的事项。最后,我们提供了几个示例代码,详细演示了如何在 Query 和 Mutation 中添加字段。
GraphQL 的动态 Schema 扩展机制给我们提供了更大的灵活性和可扩展性。在实际应用中,我们可以根据需求动态地扩展 Schema,这将使我们的应用更具适应性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6502638795b1f8cacdfaf1a3