【问题标题】:Apollo cache redirect for field with no arguments没有参数的字段的 Apollo 缓存重定向
【发布时间】:2021-06-03 09:18:59
【问题描述】:

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

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", ["id"]],
  },
  Query: {
    fields: {
      user(_, { toReference }) {
        return toReference({
          __typename: "User",
          account: {
            id: "1234",
          },
        })
      },
    },
  },
}

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

或者将 id 作为参数添加到 GetUser 查询是否更好?

【问题讨论】:

    标签: graphql apollo apollo-client react-apollo


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2018-12-26
      • 2023-03-27
      • 2019-02-22
      • 2020-07-23
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多