作者:PHP大傻子 | 来源:互联网 | 2022-12-18 13:40
在GraphQL身份验证教程中,login
是一个Mutation:
type Mutation {
post(url: String!, description: String!): Link!
signup(email: String!, password: String!, name: String!): AuthPayload
login(email: String!, password: String!): AuthPayload
}
登录不应该是查询,因为:
该操作对服务器没有副作用.
目标是查询令牌.
我在这里错过了什么吗?
1> Daniel Reard..:
在该示例的上下文中,login
应该是Query而不是Mutation,因为它的解析器没有副作用,至少根据规范.但是,有几个原因你可能不会在野外看到这样做:
如果您正在实施身份验证,则可能需要记录用户的帐户活动,方法是维护一些有关登录/注销事件的数据,或者至少在帐户记录中包含某种"上次登录"字段.修改该数据会产生副作用.
已经发展出一种惯例,即将用户操作产生的任何操作视为Mutations,而不考虑副作用.react-apollo
例如,您可以看到这一点,其中Query组件在mount上触发关联查询,而Mutation组件只是公开可以调用以触发该查询的函数.如果您计划使用Apollo客户端,那么在设计架构时考虑这些客户端功能是值得的.
突变是按顺序运行的,而查询是同时运行的.这意味着可以预见在同一个调用中触发登录变异和一个或多个其他突变,允许您利用经过身份验证的上下文进行后续调用.对于查询也是如此 - 如果login
是查询,并且在同一操作中包含其他查询,则它们将同时开始解析.
除了它们的执行方式(顺序与同时)之外,在服务器端,查询和突变实际上是可以互换的.您可以查询副作用和突变,没有副作用.您可能应该坚持使用约定,但我认为有时候您可能需要将这些约定抛到窗外.
“突变是顺序运行的,而查询是同时运行的”,这是一个很好的观察。我完全不知道 谢谢。帮助您决定是将其解析为突变还是查询。