错误:只能有一个名为“fragmentName”的片段

Posted

技术标签:

【中文标题】错误:只能有一个名为“fragmentName”的片段【英文标题】:Error: There can be only one fragment named "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”获取数据后的样子。 【参考方案1】:

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

fragment activities on techJob 
  activities: duties 
    ...duty
  

fragment dutiesSkill on Skill 
  dutiesSkill: duties 
    ...duty
  

【讨论】:

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

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

【讨论】:

以上是关于错误:只能有一个名为“fragmentName”的片段的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Server - GraphQL 错误:只能有一种名为“查询”的类型

为啥 Apollo 无法在 Xcode 中构建 - 只能有一个名为 ...的片段?

android 使用人脸功能随处可用的方法

SQL Server 中的临时表导致“已经有一个名为”的对象错误

画中画和全屏 - API 只能由用户手势启动

ThinkPHP 对接支付宝支付出现 Cannot redeclare C() 错误