微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无参数字段的 Apollo 缓存重定向

如何解决无参数字段的 Apollo 缓存重定向

我有一个与此类似的登录突变:

mutation login($password: String!,$email: String) {
  login(password: $password,email: $email) {
    jwt
    user {
      account {
        id
        email
      }
    }
  }
}

另一方面,我有一个获取帐户详细信息的查询。后端通过与请求一起发送的 JWT 令牌来验证它是哪个用户,因此无需将帐户 ID 作为参数发送。

query GetUser {
  user {
    account {
      id
      email
    }
  }
}

我现在面临的问题是:Apollo 每次都发出网络请求,因为 GetUser 没有任何参数。我会先从缓存中查询。所以我想,我可以按照 here 的描述重定向

首先,我遇到了用户字段不直接返回 id 的问题,所以我定义了一个类型策略:

const typePolicies: TypePolicies = {
  User: {
    keyFields: ["account",["id"]],},}

因此,关于重定向,我在类型策略中添加了以下内容

const typePolicies: TypePolicies = {
  User: {
    keyFields: ["account",Query: {
    fields: {
      user(_,{ toReference }) {
        return toReference({
          __typename: "User",account: {
            id: "1234",})
      },}

这行得通,但是当然有一个固定的 id。有没有办法通过始终重定向登录查询用户对象来解决此问题?

还是将 id 作为参数添加到 GetUser 查询中更好?

解决方法

我已经通过 readField 函数解决了这个问题:

  Query: {
    fields: {
      user(_,{ toReference,readField }) {
        return readField({
          fieldName: "user",from: toReference({
            __typename: "LoginMutationResponse",errors: null,}),})
      },},

如果找不到引用会怎样?看来阿波罗当时没有提出请求。是对的吗?怎么解决?

我在测试中注意到了这一点,因为没有执行登录查询。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。