graphql:使用 GraphQLObjectType 创建扩展 Mutation 的类型
Posted
技术标签:
【中文标题】graphql:使用 GraphQLObjectType 创建扩展 Mutation 的类型【英文标题】:graphql: Use GraphQLObjectType to create a type that extends a Mutation 【发布时间】:2019-03-13 12:15:34 【问题描述】:我正在使用 graphql npm 包构建一个 graphql 架构,其中包含如下所示的突变:
type Mutation
cxUnitCosts_onSave(data: [CxUnitCostInput]): [CxUnitCost]
我喜欢这样做,假设我有一个包含 GraphQLObjectTypes 的输入和输出变量:
new GraphQLObjectType(
name: 'Mutation',
fields:
[camelcase(output.toString())+'s_onSave']:
args: data: type: new GraphQLList(input),
,
type: new GraphQLList(output)
)
但我想要扩展类型突变以产生如下内容:
extend type Mutation
cxUnitCosts_onSave(data: [CxUnitCostInput]): [CxUnitCost]
我需要扩展 Mutation,因为我正在合并从 JSON Schema 以编程方式生成的大量模式(许多 cxFoo ......)如果我不扩展突变,只有一个在合并中幸存下来。
我宁愿不使用下面答案中的字符串操作,也不想手动进行合并。我不想查看架构内部。
对于我的一生,我无法弄清楚如何。
【问题讨论】:
【参考方案1】:我很遗憾我的问题没有得到答案。我最终要做的是,在管道的倒数第二步,就在我将架构写入文件之前,我替换了字符串。
replace('type Mutation', 'extend type Mutation'),
replace('type Query', 'extend type Query'),
我想有时情况就是这样。我仍然很惊讶这不能以编程方式实现。
【讨论】:
【参考方案2】:我相信您可以按照以下方式做一些事情:
const parse, GraphQLSchema = require('graphql')
const extendSchema = require('graphql/utilities)
const schema = new GraphQLSchema(
query: queryType,
);
const extension = `extend type Foo
someNewField: String
`;
const extendedSchema = extendSchema(schema, parse(extension));
但是...对于突变或任何需要自定义解析器的东西,您仍然需要使用类似 addResolveFunctionsToSchema
from graphql-tools
的东西重新添加解析器。
如果您使用 SDL 编写架构,则可以轻松扩展类型,单独编写解析器,然后使用 makeExecutableSchema
创建架构,而不是以编程方式定义架构。
如果您提供更多关于您为什么要扩展架构或您想要完成什么的上下文,我可能会提出更好的方法。
【讨论】:
我添加了一些上下文。我非常致力于以编程方式定义模式的路径。我正在转换一堆 json 模式,我真的不想发出字符串来做到这一点。 归根结底,您只需要一个具有映射到您的 Mutation 字段名称的属性的对象。也许我错过了一些东西。您是否有理由不能将您的 json 模式简化为这样的对象,然后最终将该对象传递给您的 Mutation 类型的构造函数? 我想我可以。我有许多我独立处理的 json 模式,我宁愿使用 graphql 工具将它们合并在一起,而不必查看内部。以上是关于graphql:使用 GraphQLObjectType 创建扩展 Mutation 的类型的主要内容,如果未能解决你的问题,请参考以下文章
GraphQl 和 insomnia 桌面客户端无法使用 graphql.org/swapi-graphql
如何使用 axios 将文件上传到使用 graphql-upload 实现的 graphql 后端?
春季启动graphql的问题。使用 404 请求 /graphql 结果