没有参数的字段的 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 缓存重定向的主要内容,如果未能解决你的问题,请参考以下文章