没有参数的字段的 Apollo 缓存重定向

Posted

技术标签:

【中文标题】没有参数的字段的 Apollo 缓存重定向【英文标题】:Apollo cache redirect for field with no arguments 【发布时间】: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 查询是否更好?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于没有参数的字段的 Apollo 缓存重定向的主要内容,如果未能解决你的问题,请参考以下文章

在 Apollo 中删除突变后如何重定向?

浏览器如何使用查询字符串缓存 301 重定向

java中的重定向是啥意思?

何时以及如何使用 Apollo 客户端和 React 路由器进行重定向

Python 命令输出重定向有缓存的问题

使用 Apollo 和 React 捕获身份验证失败后如何正确重定向