我第一次实现GraphQL服务器。在阅读文档时,我发现建议将gql与typeDefs(https://www.apollographql.com/docs/apollo-server/migration-two-dot#existing-schema)一起使用。我知道gql的用途,但我不明白,如果构造函数在内部解析typeDefs,为什么Apollo Server需要使用它。无论有没有,我的代码都可以工作。
为什么建议使用gql?
更新v1
由于将gql与eslint之类的工具结合使用,我立即注意到答案中描述的好处。没有gql,可用的工具不够聪明,无法区分模板字符串和graphql。
答案 0 :(得分:1)
这实际上只是Apollo团队的设计选择。 graphql-tools
是apollo-server
在后台使用的功能,它支持typeDefs
参数的多种类型,包括一个函数:
export type ITypeDefinitions = ITypedef | ITypedef[];
export type ITypedef = (() => ITypedef[]) | string | DocumentNode;
由于构造函数ApolloServer
仅将您的typeDefs
传递给graphql-tools
'makeExecutableSchema
,因此您可以避免将模式的类型定义作为字符串或函数进行传递而且仍然可以至少在JavaScript中。 TypeScript定义实际上明确地将DocumentNode
指定为类型,因此,如果您使用的是TypeScript,那就不行了。
为什么apollo-server
明确要求您传入DocumentNode
(graphql-tag
返回的内容)?正如其中一位阿波罗开发人员在this PR中指出的那样:
支持将非标签模板文字字符串作为typeDefs ...使定义没有gql标签的文档成为可能,这可能很诱人,但值得提醒自己的是,该标签具有一定的价值,因为它使易于执行静态分析,自动检测字符串操作/变量插值(通常是一种反模式),并提供了更普遍的编辑器语法突出显示支持。
如果您传递的是typeDefs
,则 应该 确保您以DocumentNode
的身份进行传递,并且最简单方法是使用gql
标签。传递其他类型之一可能看起来可行,但是文档和类型定义清楚地表明您不应该这样做。请记住,如果这样的代码不存在,则Apollo Server总是会在以后的版本中引入逻辑,当传入错误的类型时,该逻辑会导致意外行为。