0

我将 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选项,因为它除了最初的看跌外效果很好。

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

4

1 回答 1

0

您没有发布突变或解析器的代码,所以我只是在这里猜测问题出在 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)
于 2019-01-17T23:13:57.000 回答