gpt4 book ai didi

javascript - 为什么 signup 和 me 总是在 mutation 和 query 类型中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:38:46 28 4
gpt4 key购买 nike

我正在学习 GraphQL,在我看到的每个示例中,signup/loginme 调用都在 mutationquery 类型。这是为什么?示例:

type Query {
me: User
}

type Mutation {
login(email: String!, password: String!): String
}

这不应该是 User 类型吗?既然是用户相关的事情?

如果这是一个基于意见的问题,我深表歉意 - 如果是这样的话,我会关闭这个问题。

最佳答案

来自spec :

There are three types of operations that GraphQL models:

  • query – a read‐only fetch.

  • mutation – a write followed by a fetch.

  • subscription – a long‐lived request that fetches data in response to source events.

每个操作都与特定类型相关联,尽管突变和订阅类型都是可选的。所以模式可以这样定义:

schema {
query: Query
}

这里,Query 指的是一个名为Query 的类型。按照惯例,这三种类型被命名为 QueryMutationSubscription —— 但它们可以命名为任何其他名称,这并不重要.但是,它们必须是对象类型并且必须至少包含一个字段。

这些操作类型充当 GraphQL 操作的“根”,实际上是数据图的入口点。没有其他类型在根级别公开,即使它们存在于您的架构中。

meviewer 字段通常在 Query 类型上公开,以允许用户获取当前登录的用户。假设我们已经定义了一个 User 类型,如果我们将一个 me 字段添加到我们的 Query 类型,并将该字段的类型设置为 User,我们允许端点的消费者编写如下查询:

query {
me {
# some set of User fields like id, firstName, etc.
}
}

如果我们将 me 字段放在 User 类型上,a) 我们不一定有办法请求该字段,因为它不会在root,和 b) 我们将在返回 User 的任何地方公开一个 me 字段(例如,一个 friends 字段返回 Users) 这没有多大意义。

相同的逻辑适用于 login 之类的突变——我们希望它们位于操作的根部,因此我们将它们放在 Mutation 类型中。另一方面,login 应该是突变还是查询,is subjective and depends on your particular use case .

绕过突变:

如果您习惯于使用 REST,通常会看到以它们所操作的数据源为前缀的操作,例如:

POST /articles/{id}/bookmark

我们可能倾向于通过我们的突变来强制执行类似的结构,从而导致如下请求:

mutation {
article {
bookmark
}
}

然而,这是完全没有必要的,而且实际上打破了惯例并且使实现更加复杂。这样做就足够了:

mutation {
bookmarkArticle
}

有关这一点的更多信息,请参见 here .

关于javascript - 为什么 signup 和 me 总是在 mutation 和 query 类型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54755399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com