不应该';登录名不是GraphQL中的查询吗?

不应该';登录名不是GraphQL中的查询吗?,graphql,Graphql,在on-GraphQL身份验证中,登录是一个变异: type Mutation { post(url: String!, description: String!): Link! signup(email: String!, password: String!, name: String!): AuthPayload login(email: String!, password: String!): AuthPayload } 登录不应该是一个查询,因为: 该操作对服务器没有副作用

在on-GraphQL身份验证中,
登录
是一个变异

type Mutation {
  post(url: String!, description: String!): Link!
  signup(email: String!, password: String!, name: String!): AuthPayload
  login(email: String!, password: String!): AuthPayload
}
登录不应该是一个查询,因为:

  • 该操作对服务器没有副作用
  • 目标是查询令牌

  • 我在这里遗漏了什么吗?

    在这个例子的上下文中,
    登录应该是一个查询,而不是一个变异,假设它的解析器没有副作用,至少根据规范是这样。但是,有几个原因你可能看不到在野外这样做:

    • 如果要实现身份验证,您可能需要记录用户的帐户活动,方法是维护一些有关登录/注销事件的数据,或者至少在帐户记录中包含某种类型的“上次登录”字段。修改这些数据会产生副作用

    • 已经形成了一种惯例,将用户操作产生的任何操作都视为突变,而不考虑副作用。您可以通过
      react apollo
      看到这一点,例如,
      useQuery
      在装载时触发关联查询,而
      useVariation
      仅提供一个可以调用以触发该查询的函数。如果您计划使用Apple客户端,在设计模式时考虑这些客户端特性是值得的。

    • 突变是按顺序运行的,而查询是同时运行的。这意味着可以预见在同一个调用中会触发一个登录变异和一个或多个其他变异,从而允许您在后续调用中使用经过身份验证的上下文。对于查询,情况并非如此——如果
      login
      是一个查询,并且您在同一操作中包含了其他查询,那么它们将同时开始解析


    在服务器端,除了它们的执行方式(顺序执行还是同时执行)之外,查询和突变实际上是可互换的。您可能会遇到有副作用的查询和没有副作用的突变。您可能应该坚持使用约定,但我认为有时您可能有正当的理由将这些约定扔出窗外。

    谢谢您的详细解释<代码>突变是按顺序运行的,而查询是同时运行的
    这是一个很好的观察结果。我不知道。非常感谢。帮助您决定是作为突变还是查询进行解析。请注意,Apollo现在有一个钩子“useLazyQuery”,它在您手动触发加载之前不会查询数据,这与UseVariation非常类似。但是目前它没有回复这个x100的承诺(参见)。如果改为将
    mutation
    称为(公认不那么吸引人的)“命令式、非缓存查询”,则更明显的是,这正是您在此场景中想要的。如果讨论语义是你的事情,我强烈建议切换到REST API,在那里你可以畅饮。很抱歉回复太晚,据我所知,修改数据和查询只是为了检索,所以登录应该是查询。