AWS AppSync初始批处理放置不会更新缓存

时间:2019-01-16 15:45:05

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

我将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突变的突变结果后立即更新缓存。

下一个查询从服务器获取新数据后,所有其他突变都会立即更新缓存,因为现在缓存中存在具有相同键的条目。

所以我的问题只出现在初始认沽权上,我不知道该更改什么。

  • 也许从更新更新解析器映射
$util.toJson($ctx.result.data.$tableName)

要显示查询的键+空结果值?

  • 初始放置后是否清除缓存?

我肯定要使用network-and-cache选项,因为它除了初始认沽权外,效果很好。

如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

  1. 尝试将javax.servlet.ServletException: java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model 添加到AppSync中的突变响应模板中。

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

XPathFactory.newInstance()