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

Apollo client / AWS AppSync JavaScript SDK altering query result

我正在执行一个 returns 正确使用 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
        }
    }
}

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

Apollo 的缓存执行 normalization process

By default, InMemoryCache will attempt to use the commonly found primary keys of id and _id for the unique identifier if they exist along with __typename on an object.

由于您 returning 的结果没有 id 字段,因此用于它们的键是 "Field:null",对于所有结果。

这种情况下的解决方案是 return 在您的 Field children 中添加一个 ID(在您粘贴的日志中,它们的值是 null)。或者,使用 dataIdFromObject 提示缓存如何为您的 objects.

生成缓存键