【发布时间】:2019-02-19 03:38:20
【问题描述】:
在写this question 时,我意识到我希望能够在 GraphQL 中做一些非常具体的事情,但我看不到实现它的好方法。思路是这样的:
GraphQL 的优点之一是它允许您进行灵活的查询。例如,如果我想在特定forum 中的每个user 的所有posts 上查找所有comments,那么我可以进行查询
query{
findForum(id:7){
users{
posts{
comments{
content
}
}
}
}
}
这很棒。通常,您希望收集数据以对其进行变异。所以在这种情况下,也许我不想获取所有这些 cmets,而是想删除它们。一个天真的建议是在 comment 类型上实现一个 deleteComment 字段,它会改变调用它的对象。这是不好的,因为请求被标记为query,所以它不应该改变数据。
由于我们正在改变数据,我们绝对应该将其标记为mutation。但是随后我们失去了进行我们想要进行的查询的能力,因为findForum 是一个查询字段,而不是一个变异字段。 this 的一种解决方法可能是在突变类型中重新定义您需要的所有查询字段。这显然不是一个好主意,因为您重复了很多代码,并且还使query 的功能成为mutation 的严格子集。
现在,我认为“传统”的解决方案是制作一个突变场来完成这项工作而不是其他任何事情。所以你定义了一个突变字段deleteAllUserPostCommentsByForum,它接受一个参数,并以显而易见的方式实现它。但是现在你已经失去了灵活性!如果您决定要明确查找 user 并删除他们的所有帖子,或者如果您只想删除他们的 部分 帖子,则需要一个全新的变异字段。这感觉正是我认为 GraphQL 与 REST 相比有用的东西。
那么,有没有一种同时避免这些问题的好方法呢?
【问题讨论】:
标签: graphql