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 初始批量放置不更新缓存的主要内容,如果未能解决你的问题,请参考以下文章

如果项目不存在,则 Dynamodb 批量放置

批量更新数据不成功

如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存

为 AWS AppSync 客户端 iOS Swift 启用缓存

即使禁用离线,AWS AppSync 查询也会返回缓存响应

新设备上的 AWS Appsync 缓存未命中和 403 错误