AWS AppSync 初始批量放置不更新缓存
Posted
技术标签:
【中文标题】AWS AppSync 初始批量放置不更新缓存【英文标题】:AWS AppSync initial batch put does not update cache 【发布时间】:2019-06-10 18:00:11 【问题描述】:我将 AWS AppSync 与 Angular 7 应用程序一起使用,并像这样初始化客户端:
let instance: AWSAppSyncClient<NormalizedCacheObject> = new AWSAppSyncClient(
url: environment.graphqlEndpoint,
region: environment.region,
auth:
type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
jwtToken: async() => //return token
,
cacheOptions:
dataIdFromObject: (obj : any) => `$obj.__typename:$obj.key`
);
当 AppSync 进行查询并且 dynamodb 中已经有请求的值时,它可以正常工作:
"data":
"getDefaultSettings": [
"key": "setting_a",
"value": "true"
,
"key": "setting_b",
"value": "false"
]
这个查询结果被缓存,当我进行突变时,突变的响应:
"data":
"addDefaultSettings": [
"key": "setting_a",
"value": "false"
,
"key": "setting_b",
"value": "false"
]
通过也正常工作的键比较导致缓存更新。
但是,当 dynamodb 中还没有值时,获取返回的结果如下:
"data":
"getDefaultSettings": [
null,
null
]
所以现在这个查询被缓存了,当对结果进行突变时
"data":
"addDefaultSettings": [
"key": "setting_a",
"value": "false"
,
"key": "setting_b",
"value": "false"
]
它无法更新缓存。所以接下来的几次执行从缓存中获取的查询,我仍然得到空结果,但是我需要在收到初始 put 突变的突变结果后立即更新缓存。
一旦下一个查询从服务器获取新数据,所有进一步的突变都会立即更新缓存,因为现在缓存中存在具有相同键的条目。
所以我的问题只出现在最初的 put 上,我不知道要改变什么。
可能会更新解析器映射$util.toJson($ctx.result.data.$tableName)
要显示查询键+空结果值?
在初始放置后清除缓存?我绝对想使用network-and-cache
选项,因为除了初始放置之外它工作得很好。
如果有人能帮我解决这个问题,我将不胜感激。
【问题讨论】:
【参考方案1】:您没有发布突变或解析器的代码,所以我只是在这里猜测问题出在 DynamoDB 读取一致性上。
尝试将"consistentRead" : true
添加到 AppSync 中的突变响应模板中。
像这样在响应模板中构建乐观响应
## Raise a GraphQL field error in case of a datasource invocation error
#if($ctx.error)
$util.error($ctx.error.message, $ctx.error.type)
#end
## Pass back an optimistic result from DynamoDB. **
#set ($items = ["key":"setting_a", "value": $ctx.args.setting_a, ...])
$util.toJson($items)
【讨论】:
以上是关于AWS AppSync 初始批量放置不更新缓存的主要内容,如果未能解决你的问题,请参考以下文章
如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存