graphql:使用 GraphQLObjectType 创建一个扩展 Mutation 的类型

graphql: Use GraphQLObjectType to create a type that extends a Mutation

我正在使用 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 ...)如果我不扩展 mutation,只有一个幸存合并。

我不想像下面的答案那样使用字符串操作,也不想手动进行合并。我不想查看架构内部。

我这辈子都不知道怎么办。

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

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-tools.

中的 addResolveFunctionsToSchema 之类的东西重新添加解析器

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

如果您提供更多有关扩展架构的原因或您想要完成的目标的上下文,我可能会建议更好的方法。

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

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

我猜有时候就是这样。我仍然很惊讶这无法以编程方式实现。