问题标签 [graphql-tools]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
27 浏览

javascript - 将远程 GraphQL 查询包装到公共父级中

我正在尝试进行标准的 GraphQL 远程模式合并(工作正常),但是对于每个远程模式,我想在合并后将它们的查询包装在顶级查询中以进行分离。

例如:

我希望将其合并在一起以形成顶级查询类型:

我正在使用该graphql-tools包进行合并和远程模式自省/创建,但似乎没有办法将合并模式的查询分割成单独的顶级选项。以前有没有人这样做过,或者知道完成它的干净方法?

0 投票
1 回答
262 浏览

node.js - 在 Apollo GraphQL 中跨本地和远程模式的嵌套数组中建模数据的最佳方法?

我是graphql和apollo的新手。我有一个本地 Graphql 模式,它使用嵌套的对象数组,并在使用 Mongoose 的解析器中映射到 mongoDB。

我对此的查询工作正常,但我也有一个远程模式,它来自我正在运行的 hasura 实例并映射到 postgreSQL DB。此远程模式包含问题信息。我已经使用 graphql-tools 模块合并了这些模式,现在可以通过我的本地 apollo 服务器实例独立地查询这两个模式。

我的问题是,对于上面架构中的 Section 类型,我希望它采用以下格式:

有没有办法实现这种模型并修改解析器,以便我可以查询到 Section 级别并从远程模式中获取问题数组?

还是我在叫错树?如果是这样,任何人都可以想出一种更好的方法来跨模式对此类数据进行建模吗?

我们欢迎所有的建议!谢谢

0 投票
0 回答
160 浏览

graphql - 如何强制服务器端的过滤器到 graphql 查询?

想象一下,我有一个名为“users”的查询,它返回所有用户并且这些用户可以与一个或多个公司相关联,所以我有一个 UserCompanies 类型(我需要它,因为它保存了关系之外的更多信息)。我正在使用 Prisma,我需要强制一个过滤器只返回与请求者属于同一公司的用户。我从 JWT 获得公司的信息,需要在将其发送到 Prisma 之前将其注入到查询中。

所以,查询应该是这样的:

在服务器端,我应该将其转换为:(用户可以,只需更改参数)

我看到了一些解决方案,但我不知道这是否是最好的方法: 1 - 使用 addFragmentToInfo,完成对查询设置条件的工作,但如果查询已经设置了用户公司,它给出我一个冲突。否则,它工作正常。2 - 我可以为查询使用别名,但在 DB 结果之后,我需要编辑数组中的所有结果以覆盖结果。3 - 不要在 Prisma 上使用信息并在 js 中过滤。4 - 编辑 GraphqlResolveInfo 类型的信息(第 4 个参数)

0 投票
1 回答
285 浏览

graphql-js - 如果获得超过 1 个模式,Graphql 工具 mergeSchemas 会抛出错误

我正在尝试使用 graphql 工具来执行模式拼接。但是,如果我传递多个模式,则会引发 2 个错误。

有时它会抛出

或者

我的架构设置非常简单。我只有 2 个模式国家和城市。那些也有 UUID、JSON 标量类型。

有趣的是,如果我将 countrySchema 或 citySchema 传递给 schemas 数组。有用。但他们都抛出了我上面提到的错误。

请分享你的想法。

0 投票
1 回答
250 浏览

graphql - 架构指令不按架构中指定的 LTR 顺序执行

我正在使用graphql-tools@v6并且已经实现了两个指令@map@filter. 我的目标是像地图和过滤器管道一样使用它们。在某些情况下,我想在过滤之前进行映射,而在其他情况下,反之亦然。这些指令是使用Schema Directives API实现的,并且当仅应用一个指令时它们会按预期工作。

但是,如果我将它们一起使用,那么它们总是以一种特定的顺序执行,这与它们在模式中的声明方式不匹配。

例如

在这种情况下,要么映射两个字段,然后过滤,反之亦然。顺序由我在schemaTransforms属性中传递它们的方式控制。

我相信由于这些转换是作为数组传递的,所以它们的执行顺序取决于数组的顺序。我可以用它们替换它们,directiveResolvers但它们的功能有限。

但是让我失望的是文档中的以下声明

使用directiveResolvers 的现有代码可以考虑迁移到直接使用mapSchema

因为它们在执行顺序方面有不同的行为,所以我看不出它们是如何互换的。

有人可以解释是否有办法保证模式指令按照它们在特定字段的模式中使用的顺序执行?

0 投票
3 回答
1718 浏览

node.js - 使用 ApolloServer 从 graphql-import 迁移到仅 graphql-tools 时遇到问题,指令停止工作

我的困境始于将我的 graphql 模式从单个 .graphql 文件扩展到多个文件的简单愿望,这样我就可以更好地组织模式,因此它不会发展成一个失控的巨大文件。

我的原始布局非常简单,我在schema.graphql文件中有一个工作模式。我将能够使用importSchema('server/schema.graphql')graphql-import 库将其解析为字符串,该库现已弃用https://github.com/ardatan/graphql-import

他们提到它已合并到graphql-tools最新版本中并在此处提供迁移教程https://www.graphql-tools.com/docs/migration-from-import该教程似乎非常简单,因为他们的第一个示例几乎说明了正是我的代码的样子(除了我不使用 es6 import 但老式要求):

然后他们说要修改它,只需进行这些更改

我进行了这些更改,但重要的区别是它们不再makeExecutableSchema()在他们的示例中使用,这对我来说非常重要,因为我需要包含指令。我现在用架构做什么?我如何声明指令?他们的指令文档仍在使用makeExecutableSchema,但我不能再使用它了,因为新loadSchemaSync函数返回一个对象而不是我需要传递给的字符串typeDefs文字makeExecutableSchema

我正在使用 apollo-server,所以似乎一种可能的解决方法是在 apollo-server 构造函数中声明指令,然后将这个新schemaWithResolvers的作为模式传递

这允许我的服务器运行,并且我可以执行查询和突变,但是,我的指令不再起作用,并且我不再对受保护的查询进行身份验证。

我想要一种方法来导入我的 .graphql 文件并将其解析为字符串,这样我就可以typeDefs像以前使用 importSchema() 一样在内部使用它,或者在不使用 makeExecutableSchema() 的情况下声明我的指令,以便它们继续工作!

我已经浏览了文档并查看了其他库,到目前为止我一直很短,非常感谢任何提示或指导

0 投票
0 回答
302 浏览

express - 用于检查输入类型的列表长度的自定义指令

我尽力在 apollo server express 中编写一个自定义指令,以验证 [Int] 类型的输入类型字段是否不超过最大长度,但不知道它是否正确。感谢有人可以帮助我纠正下面代码中的任何错误。

这看起来对吗?

谢谢

0 投票
0 回答
1044 浏览

javascript - 如何使用 graphql-upload 上传图片

我尝试将文件上传到具有 graphql-tool 的 graphql 服务器。我已经设置了请求多部分规范,并使用 Altair graphql 客户端向 graphql 端点发出请求。

我收到错误SyntaxError: Unexpected token - in JSON at position 0 ,我不知道我做错了什么。请帮帮我。

下面是我的代码

在我的解析器中,我包括GraphQLUpload

在我的类型定义中,我有

我使用 altair graphql-client 但我收到此错误

SyntaxError: Unexpected token - in JSON at position 0

我不知道我做错了什么。请帮帮我

0 投票
1 回答
100 浏览

javascript - 在一个类中存储一个变量“gobally”以供graphql指令中的多个方法使用

所以我觉得我的问题很可能是关于类的 JS 语法问题,但我的问题与用于在 GraphQL 中创建自定义指令的类this直接相关。graphql-toolsSchemaDirectiveVisitor

一点上下文:在 GraphQL 中创建自定义指令时,一种方法是扩展 graphql-tools 提供的 SchemaDirectiveVisitor 类,并覆盖它们的任何默认方法,这些方法可以应用于 gql 模式的不同位置。更多细节可以在这里看到

在我的具体情况下,我使用该方法visitInputFieldDefinition是因为我想添加一些自定义逻辑来验证用户是否有权编辑特定字段。主要问题visitInputFieldDefinition是它似乎只在构建服务器时触发,因为它没有解析器功能。同时,其他方法,例如visitFieldDefinition确实有一个resolve()函数,每次有这个指令的新请求时都会触发。

visitInputFieldDefinition我试图做的是在读取我的 gql 模式之后调用服务器启动时将一些数据存储在数组中。我可以将一些数据保存在类外部的数组中,然后在我的 resolve() 函数中使用该数据来确定是继续还是返回错误。我能够做到这一点并且它有效,但我的问题实际上是关于如何获得相同的行为,但以某种方式将这些数据存储在我的类内的 var 中,而不是类外的全局变量中

所以我的代码,简化后,看起来像这样

正如我所提到的,这种方法对我来说效果很好,但我不喜欢我在类外有一个全局变量的事实,而我想把它放在里面。我试图将它存储在类中的变量中,甚至存储在类中的另一个方法中,但我有两个问题

  1. 该类在启动服务器时被多次调用,因此即使我设法在构造函数级别将数据存储在 var 中,它也不会通过多次调用持续存在,如果constructor()我包含类似的东西,它总是会被重置this.myVar = []

  2. 我似乎无法访问函数this内部field.resolve(),我不知道如何授予它访问类的权限,this以便我可以调用另一个方法或类 var,例如this.myVar

问题主要是关于最佳实践,可能避免使用外部全局变量的可能改进,或者根本没有办法做到这一点,这种方法可以被认为是“正确的”。

谢谢阅读!任何讨论都是受欢迎和有用的!

0 投票
0 回答
545 浏览

graphql - 如何通过 Apollo Server 将 mergeSchemas 用于远程模式

我在合并远程模式时遇到了一些问题。作为基础,我采用了教程中引用的 Apollo GraphQL 包 ( https://www.apollographql.com/docs/tutorial/introduction/ )。我想对以下架构进行原型设计:

  • 2 项服务
  • 1 个代理对这些服务的请求的网关
  • 我不想像阿波罗联盟那样使用解决方案
  • 我想使用关注点分离模式

以下是这两个服务的基本类型 def:

公司架构:

i18n 架构:

服务实现相应的解析器。网关为这些服务生成远程方案并尝试合并它们。这就是导致一些问题的原因

第一个问题是数组中模式的顺序似乎很重要。如果 executableCompanySchema 是我可以正确查询公司数据的最后一个元素。一旦我将它移动到第一个位置,我就会收到类似“无法查询name类型字段的消息,Company因为mergeSchemas只从最后一个数组元素中获取 typeDefs 并覆盖前一个元素中的一次。我希望合并函数合并给定的模式适当地。

所以我做了一些研究,发现在最近的 graphql-tools 版本中存在一个stitchSchemas 函数。所以我已经将它们更新到最新版本,现在stitchSchemas 而且mergeSchemas 返回合并模式的预期typeDefs 等。看起来我已经取得了一些进展,但是当我尝试在 Playground 中发出查询请求时,我得到一个错误:超出了最大调用堆栈大小。因此,Apollo 服务器似乎与最新的 graphql-tools 版本不兼容。

有什么想法或想法吗?