React-Native + Apollo-Link-State + AWS Appsync :默认值不存储在缓存中
React-Native + Apollo-Link-State + AWS Appsync : Defaults are not stored in cache
我为此苦苦挣扎了好几天。
一个月前,我已经使用 AppSync 成功配置了 Apollo-Link-State,并开始添加默认值和解析器,如下所示:
const cache = new InMemoryCache() //create the cache to be shared by appsync and apollo-link-state
const appSyncAtrributes = {
//...
//setup appSync
}
const stateLink = createLinkWithCache(() => withClientState({
cache,
resolvers: {
Mutation: {
updateCurrentUser: (_, { username, thumbnailUrl }, { cache }) => {
// ...
// working mutation that store the login information when user authenticate.
}
}
},
defaults: {
currentUser: {
__typename: 'CurrentUser',
username: '',
thumbnailUrl: ''
}
}
}))
const appSyncLink = createAppSyncLink({
url: appSyncAtrributes.graphqlEndpoint,
region: appSyncAtrributes.region,
auth: appSyncAtrributes.auth,
complexObjectsCredentials: () => Auth.currentCredentials()
})
const link = ApolloLink.from([stateLink, appSyncLink])
const client = new AWSAppSyncClient({}, { link })
它工作了这么久(我在我的应用程序周围调用@client 突变和查询)。
但现在我正尝试在我的 Linked 状态中添加其他数据(其他一切保持不变):
defaults: {
currentUser: {
__typename: 'CurrentUser',
username: '',
thumbnailUrl: '',
foo: 'bar',
},
hello: 'world',
userSettings: {
__typename: 'userSettings',
isLeftHanded: true
}
}
而且我的缓存没有更新。我的意思是:
currentUser
仍然包含 __typename: 'CurrentUser', username: '', thumbnailUrl: '
但不包含 foo: 'bar'. And the cache doensn't contains
hello: 'bar'or
userSettings`.
更令人困惑的是,如果我给 username
或 thumbnailUrl
一个值,比如 username: 'joe'
,缓存实际上反映了那个变化! (同时忽略我所有其他修改)
我尝试了这个实验的所有变体并清除了所有缓存(甚至 运行 它在一台新的同事计算机上以确保它们没有涉及脏缓存)。
我完全不懂。
上下文:
- 它发生在 iOS 模拟器中
- 我正在调试观察 appsync 的 redux 缓存
- apollo-cache-inmemory: 1.2.8
- 阿波罗客户端:2.3.5
- 阿波罗-link: 1.2.2
- apollo-link-状态:0.4.1
- aws-appsync: 1.3.2
更新:实际上 currentUser 既不是默认存储的。它在调用 mutation 时进入缓存。
好吧,我的问题毕竟不是问题(浪费了 2 天)。
缺乏合适的调试工具(必须观察缓存通过 redux 的演变)是问题所在。
缓存实际上写对了,但是没有显示在任何地方。
我一开始查询缓存,一切正常。
等不及 react-native-debugger 集成合适的 apollo/graphql 分析器
我为此苦苦挣扎了好几天。
一个月前,我已经使用 AppSync 成功配置了 Apollo-Link-State,并开始添加默认值和解析器,如下所示:
const cache = new InMemoryCache() //create the cache to be shared by appsync and apollo-link-state
const appSyncAtrributes = {
//...
//setup appSync
}
const stateLink = createLinkWithCache(() => withClientState({
cache,
resolvers: {
Mutation: {
updateCurrentUser: (_, { username, thumbnailUrl }, { cache }) => {
// ...
// working mutation that store the login information when user authenticate.
}
}
},
defaults: {
currentUser: {
__typename: 'CurrentUser',
username: '',
thumbnailUrl: ''
}
}
}))
const appSyncLink = createAppSyncLink({
url: appSyncAtrributes.graphqlEndpoint,
region: appSyncAtrributes.region,
auth: appSyncAtrributes.auth,
complexObjectsCredentials: () => Auth.currentCredentials()
})
const link = ApolloLink.from([stateLink, appSyncLink])
const client = new AWSAppSyncClient({}, { link })
它工作了这么久(我在我的应用程序周围调用@client 突变和查询)。
但现在我正尝试在我的 Linked 状态中添加其他数据(其他一切保持不变):
defaults: {
currentUser: {
__typename: 'CurrentUser',
username: '',
thumbnailUrl: '',
foo: 'bar',
},
hello: 'world',
userSettings: {
__typename: 'userSettings',
isLeftHanded: true
}
}
而且我的缓存没有更新。我的意思是:
currentUser
仍然包含 __typename: 'CurrentUser', username: '', thumbnailUrl: '
但不包含 foo: 'bar'. And the cache doensn't contains
hello: 'bar'or
userSettings`.
更令人困惑的是,如果我给 username
或 thumbnailUrl
一个值,比如 username: 'joe'
,缓存实际上反映了那个变化! (同时忽略我所有其他修改)
我尝试了这个实验的所有变体并清除了所有缓存(甚至 运行 它在一台新的同事计算机上以确保它们没有涉及脏缓存)。
我完全不懂。
上下文:
- 它发生在 iOS 模拟器中
- 我正在调试观察 appsync 的 redux 缓存
- apollo-cache-inmemory: 1.2.8
- 阿波罗客户端:2.3.5
- 阿波罗-link: 1.2.2
- apollo-link-状态:0.4.1
- aws-appsync: 1.3.2
更新:实际上 currentUser 既不是默认存储的。它在调用 mutation 时进入缓存。
好吧,我的问题毕竟不是问题(浪费了 2 天)。
缺乏合适的调试工具(必须观察缓存通过 redux 的演变)是问题所在。 缓存实际上写对了,但是没有显示在任何地方。
我一开始查询缓存,一切正常。
等不及 react-native-debugger 集成合适的 apollo/graphql 分析器