【问题标题】:AWS AppSync initial batch put does not update cacheAWS AppSync 初始批量放置不更新缓存
【发布时间】: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 选项,因为除了初始放置之外它工作得很好。

如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: graphql angular7 aws-appsync dynamodb-queries appsync-apollo-client


    【解决方案1】:

    您没有发布突变或解析器的代码,所以我只是在这里猜测问题出在 DynamoDB 读取一致性上。

    1. 尝试将"consistentRead" : true 添加到 AppSync 中的突变响应模板中。

    2. 像这样在响应模板中构建乐观响应

        ## 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)
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 2019-12-11
      • 2019-08-09
      • 2015-07-23
      • 2011-06-30
      • 2019-08-08
      • 1970-01-01
      • 2019-02-03
      • 2019-02-21
      相关资源
      最近更新 更多