GraphQL:嵌套查询与根查询

时间:2019-01-03 17:06:39

标签: graphql apollo

我在服务器上使用Apollo GraphQL,并且正在尝试设计GraphQL API。我遇到的一个问题是,相对于根查询,我是否应该更喜欢嵌套查询。

在本示例中,我们同时检查了当前用户me有很多invitations的情况。

根本查询

me {
    id
    name
}

invitations {
    id
    message
}

invitations的解析器返回当前用户的邀请。

嵌套查询

me {
    id
    name
    invitations {
        id
        message
    }
}

除了使用后一种方法将邀请嵌套在用户对象me中之外,这些方法应该达到相同的结果。我担心的是,如果此方法与Apollo Client保持一致,可以使缓存保持一致。

设计GraphQL查询的推荐方法是什么?

2 个答案:

答案 0 :(得分:2)

GraphQL卖点之一是允许客户具有很大的灵活性,以最小的请求数来定义他们要查询的数据的形状。他们还鼓励开发人员在设计架构时使用“ Think in Graphs”。

因此,我将进行嵌套查询,该查询看起来更像一个图形。此外,它更加灵活。如果用户希望通过邀请获取其用户个人资料数据,则只能在单个请求中获取它们。如果他们只想获取配置文件数据,则只需忽略查询中的邀请部分,由于GraphQL的设计性质,服务器不会浪费任何资源来获取邀请数据。

答案 1 :(得分:1)

我会说这确实取决于情况。就我个人而言,我将嵌套属性视为上下文:如果API使用者希望获取矿山通知,则它是me { notifications { ... } },而不是notifications { ... }。例如,如果有一个顶级密钥是有意义的,那么就有一个 global 通知(不依赖于用户)的概念,然后继续使用。如果每个用户都有自己的通知(我认为是正确的),则类型me的{​​{1}}应该具有通知,就像每个User一样。这种概括鼓励了可重用的思想:使用User代替user(id: ...) { ... }的管理面板可以免费使用相同的UI代码

根据经验,最好考虑使用该API,而不提供它。