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

时间:2018-10-08 19:22:47

标签: graphql graphql-js

我正在使用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,因为我将大量构建的架构合并在一起,如果我不合并,那么只有一个突变可以幸免。我宁愿不像下面的答案中那样使用String操作,也不希望不必手动进行合并。我不想查看架构内部。

对于我的一生,我不知道怎么做。

2 个答案:

答案 0 :(得分:1)

我相信您可以按照以下方式做些事情:

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中的graphql-tools的方式重新添加解析程序。

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

如果您提供有关扩展架构或尝试完成的原因的更多背景信息,我可能会建议一种更好的方法。

答案 1 :(得分:0)

很抱歉,我没有得到我的问题的答案。我最后要做的是,在流水线的倒数第二步中,就是在将模式写入文件之前,我替换了字符串。

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

我想有时候就是这样。我仍然感到惊讶,这无法通过编程实现。