能够用相同的字段扩展所有Apollo/GraphQL突变&引用;“通用片段”;受通缉的 问题定义

能够用相同的字段扩展所有Apollo/GraphQL突变&引用;“通用片段”;受通缉的 问题定义,graphql,apollo,apollo-client,react-apollo,Graphql,Apollo,Apollo Client,React Apollo,在我目前正在进行的项目中,我们使用React with 在我们的所有突变中,我们的反应中有以下字段: ok errors { field messages } 后端用这些字段扩展了所有的突变,因此最好用一种好的、短的方法将这些字段包含在前端的所有突变中,并且能够在将来改变这个“片段” 因此,我感兴趣的是在我所有的突变中把这4条相同的线缩短成1条 到目前为止,我所尝试的: 我已经试着研究过了,但是他们似乎需要一种类型,字段是on或“相关的”,例如 这里,framentNameParts是

在我目前正在进行的项目中,我们使用React with

在我们的所有突变中,我们的反应中有以下字段:

ok
errors {
  field
  messages
}
后端用这些字段扩展了所有的突变,因此最好用一种好的、短的方法将这些字段包含在前端的所有突变中,并且能够在将来改变这个“片段”

因此,我感兴趣的是在我所有的突变中把这4条相同的线缩短成1条

到目前为止,我所尝试的: 我已经试着研究过了,但是他们似乎需要一种类型,字段是
on
或“相关的”,例如

这里,frament
NameParts
是使用
Person
创建的。然而,我对扩展所有突变感兴趣

如果我能像这样制作一个通用片段,那就太好了:

fragment OkAndErrors {
  ok
  errors {
    field
    messages
  }
}
这似乎是不可能的

我还尝试制作一个字符串,并将其导入到我的变体中,如下所示:

export const OK_AND_ERRORS: string = `
  ok
  errors {
    field
    messages
  }
`;
同样,它没有起作用

我不确定我是否可以用字符串或JSON智能地使用
gql
函数

还有一个问题,但我怀疑它是否能用于我所需要的,而且阿波罗中内联片段的文档很少


本质上:有没有一个聪明的方法来扩展阿波罗突变?通用片段存在吗?

首先,片段不仅限于Apollo,而且只是常规GraphQL查询的一部分。GraphQL站点本身实际上有一个很好的解释:

本质上,我们可以将片段放在任何查询上以提取数据依赖项,但它们对于使用X类型条件上的
匹配类型也很有用

在你的例子中,你是说每个变异都返回一种结果类型,它有一个公共的
错误
字段。这说明您可能已经有了
MutationError
类型。但是,这些
MutationResult
类型都有
错误
字段,如果它们还没有实现接口,那么它们都应该实现接口

在模式语言中,接口是一个很好的工具,可以明确定义实现它的类型必须始终包含一组特定的字段,在本例中是
errors
字段。这意味着我们可以这样写我们的结果:

interface MutationResult {
  errors: [MutationError!]
}

type ExampleMutationResult implements MutationResult {
  ok: Boolean
  errors: [MutationError!]
}

type UserMutationResult implements MutationResult {
  user: User
  errors: [MutationError!]
}
正如您在上面看到的,
MutationResult
接口现在由几个结果实现,这允许我编写一个可重用的片段,可以应用于实现它的任何类型,例如

fragment MutationResultErrors on MutationResult {
  errors {
    field
    messages
  }
}
然后我就可以开始用它来定义所有的变异查询了。在GraphQL中,这比在查询中执行一些客户端文档转换、字符串插值或类似操作更容易预测和预期,因为它将被烘焙到您的模式中


旁注:我还想说的是,我发现人们已经开始将他们的突变分为“错误”和“结果”,并通过某种联合或接口来区分这两者。但通常情况下,它们会在消息中实现一般错误。重要的是,不携带任何关系数据的错误实际上已经烘焙到GraphQL中:

smart?我看到一些地方(如此?)该链接可用于删除变量中的所有
\uuuTypeName
道具,用于突变。。。您可以尝试使用链接将您的字段添加到查询的突变道具(AST)中。您所说的“如此”是什么意思?“链接”是什么意思?阿波罗博士,你指的是这个吗?如果你能提供一个你读过的文章的链接,那就太好了:-)我希望我的问题可以理解。是的,阿波罗链接。。。订阅配置将订阅查询定向到套接字链接。。。删除typename?不难找到不知道阿波罗有中间件-完美!谢谢!我会尝试一下,很快我会发布我问题的答案:)
interface MutationResult {
  errors: [MutationError!]
}

type ExampleMutationResult implements MutationResult {
  ok: Boolean
  errors: [MutationError!]
}

type UserMutationResult implements MutationResult {
  user: User
  errors: [MutationError!]
}
fragment MutationResultErrors on MutationResult {
  errors {
    field
    messages
  }
}