graphql:使用GraphQLObjectType创建扩展变异的类型

graphql:使用GraphQLObjectType创建扩展变异的类型,graphql,graphql-js,Graphql,Graphql Js,我正在使用graphql npm包构建一个graphql模式,其中包含一个如下所示的突变: type Mutation { cxUnitCosts_onSave(data: [CxUnitCostInput]): [CxUnitCost] } 我喜欢这样做,假设我有一个包含GraphQLObjectType的输入和输出变量: new GraphQLObjectType({ name: 'Mutation', fields: { [camelcase

我正在使用graphql npm包构建一个graphql模式,其中包含一个如下所示的突变:

type Mutation {
  cxUnitCosts_onSave(data: [CxUnitCostInput]): [CxUnitCost]
}
我喜欢这样做,假设我有一个包含GraphQLObjectType的输入和输出变量:

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]
}
我需要扩展变异,因为我正在将大量构建的模式合并在一起,如果我不这样做,只有一个变异在合并中幸存。我不希望像下面的答案那样使用字符串操作,也不希望必须手动进行合并。我不想查看模式内部


就我个人而言,我不知道该怎么做。

我相信你可以按照以下思路做一些事情:

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));
但是。。。对于一个突变或任何需要自定义解析器的东西,您仍然需要从
graphql工具
中添加类似
addResolveFunctionsToSchema
的解析器

如果您使用SDL编写模式,单独编写解析器,然后使用
makeExecutableSchema
创建模式,而不是以编程方式定义模式,则可以轻松地扩展类型


如果您提供更多关于扩展模式的原因或您试图实现的目标的上下文,我可能会建议一种更好的方法。

我很遗憾,我的问题没有得到答案。最后我做的是,在管道的倒数第二步,在我将模式写入文件之前,替换字符串

replace('type Mutation', 'extend type Mutation'),
replace('type Query', 'extend type Query'), 

我想有时候就是这样。我仍然很惊讶这在编程上是不可行的。

我添加了一些上下文。我非常致力于以编程方式定义模式。我正在转换一堆json模式,我真的不想发出字符串来实现这一点。最终,你只需要一个具有映射到你的字段名的属性的对象。也许我错过了什么。有什么原因不能将json模式简化为这样的对象,然后最终将该对象传递给变异类型的构造函数吗?我想可以。我有许多独立处理的json模式,我宁愿使用graphql工具将它们合并在一起,而不必查看内部。