Apollo客户端/ AWS AppSync JavaScript SDK更改查询结果

时间:2018-09-03 14:15:13

标签: graphql apollo aws-appsync

我正在执行一个简单的查询,该查询使用AppSync控制台正确返回,但是当我从应用程序内部执行相同的查询时,数据返回错误。具体来说,在要返回的对象中有一个子类型的数组,虽然该数组中的实例数正确,但是每个实例都是第一个实例的副本。

我在客户端上禁用了本地缓存,并从数据库中的数组中删除了第一个实例,当我在控制台中运行查询时,它运行良好,但是问题仍然存在于应用程序中(尽管现在有了新的第一个实例)被复制)。

控制台输出:

{
  "data": {
    "getTemplates": [
      {
        "name": "test template",
        "data": [
          {
            "name": "Assigned User",
            "format": "String"
          },
          {
            "name": "Office",
            "format": "String"
          },
          {
            "name": "Department",
            "format": "String"
          }
        ]
      }
    ]
  }
}

应用程序的浏览器日志输出:

0
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}
1
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}
2
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}

查询和记录代码:

<Query query={getTemplatesQuery}>
    {({ loading, error, data }) => {
        if (loading) return null;
        if (error) return `Error: ${error}`;

        console.log(data);
        console.log(data.getTemplates);
        return (
            <DataTable data={data.getTemplates} />
        );
    }}
</Query>

查询,将粘贴从应用程序复制到控制台以进行测试:

{
    getTemplates {
        id
        name
        author
        data {
            id
            name
            format
        }
    }
}

谁能告诉我这是怎么回事呢?有没有简便的方法可以从另一个客户端进行测试?

1 个答案:

答案 0 :(得分:1)

阿波罗的缓存执行normalization process

  

默认情况下,InMemoryCache将尝试使用id_id的常见主键作为唯一标识符(如果它们与__typename一起存在于对象上)。

由于您要返回的结果没有id字段,因此对于所有这些关键字,它们使用的密钥为"Field:null"

在这种情况下,解决方案是在Field个孩子中返回一个ID(在您粘贴的日志中,其值是null)。或者,使用dataIdFromObject向缓存提供有关如何为对象生成缓存键的提示。