【问题标题】:Error: There can be only one fragment named "fragmentName"错误:只能有一个名为“fragmentName”的片段
【发布时间】:2018-12-19 21:51:10
【问题描述】:

我正在更改我的架构格式:

var OldSchema = new GraphQLSchema({
  query: queryType,
  mutation: mutationType
});

到这里:

typeDef = `
type Query {
  posts: [Post]
  author: Author
}
`;

const NewSchema = makeExecutableSchema({
  typeDefs: [typeDef],
  resolvers: resolvers
});

由于我有很多字段,我想将它们从旧格式一个一个转移到新格式,我正在使用graphql-tools的mergeSchemas功能:

export const RootSchema = mergeSchemas({
  schemas: [NewSchema, OldSchema]
});

当我尝试创建一个查询(仅从 OldSchema 获取字段)时,我收到错误消息**只能有一个名为“duty”的片段。

这是我的查询的样子:

query {
  person {
    ...personFragment
  }
}
fragment conceptFragment on Person {
  jobs {
    ... on techJob {
      ...activities
    }
    ... on carpentryJob {
      ...skillSet
    }
  }
}
fragment activities on techJob {
  duties {
    ...duty
  }
}
fragment duty on Duties {
  id
}
fragment skillSet on carpentryJob {
  skills {
    ...dutiesSkill
  }
}
fragment dutiesSkill on Skill {
  duties {
    ...duty
  }
}

我知道解析中发生了错误,并且似乎正在对 OldSchema 和 RootSchema 进行查询验证,但 RootSchema 是失败的。

【问题讨论】:

  • 难道……职责就应该是职责?
  • 不,那是指Duties上的碎片碎片税。问题在于 OldSchema 和 RootSchema 的验证正在发生。但是,每当它对 OldSchema 进行验证时,它就会搞砸,并将所有 ... 视为片段定义,而不是内联片段。
  • 使用大写的类型名称和片段名称可能会更清楚,这样您就不会将它们与字段混淆。
  • 我很想看看查询被模式合并重写以从“OldSchema”获取数据后的样子。

标签: javascript apollo graphql-js graphql-tools


【解决方案1】:

您可以给其中一个片段一个alias 吗?喜欢:

fragment activities on techJob {
  activities: duties {
    ...duty
  }
}

fragment dutiesSkill on Skill {
  dutiesSkill: duties {
    ...duty
  }
}

【讨论】:

  • 这不是问题,问题在于将...职责计算为定义两次
【解决方案2】:

此问题已通过更新到 v14.0.0-rc.2 版本得到解决。没有提及正在解决的问题。

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2019-04-16
    • 1970-01-01
    • 2019-08-31
    • 2020-03-11
    • 2012-11-08
    • 2019-03-26
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多