【问题标题】:Apollo readQuery Fails Even Though Target Object is Present?即使存在目标对象,Apollo readQuery 也会失败?
【发布时间】:2018-09-25 12:25:50
【问题描述】:

我正在调用 readQuery。我收到一条错误消息:

modules.js?hash=2d0033b4773d9cb6f118946043f7a3d4385825fe:25847 
Error: Can't find field resolutions({"id":"Resolution:DHSzPa8bvPCDjuAac"}) 
on object (ROOT_QUERY) {
  "resolutions": [
    {
      "type": "id",
      "id": "Resolution:AepgCCio9KWGkwyMC",
      "generated": false
    },
    {
      "type": "id",
      "id": "Resolution:DHSzPa8bvPCDjuAac",  // <==ID I'M SEEKING
      "generated": false
    }
  ],
  "user": {
    "type": "id",
    "id": "User:WWv57KsvqWeAoBNHY",
    "generated": false
  }
}.

具有该 id 的对象作为分辨率列表中的第二个条目似乎是显而易见的。

这是我的查询:

const GET_CURRENT_RESOLUTION_AND_GOALS = gql`
  query Resolutions($id: String!) {
    resolutions(id: $id) {
      _id
      name
      completed
      goals {
        _id
        name
        completed
      }
    }
  }
`;

...我是这样称呼它的:

<Mutation
    mutation={CREATE_GOAL}
    update={(cache, {data: {createGoal}}) => {
        let id = 'Resolution:' + resolutionId;
        const {resolutions} = cache.readQuery({
            query: GET_CURRENT_RESOLUTION_AND_GOALS,
            variables: {
                id
            },
        });
    }}
>

我错过了什么?

更新

根据 Chrome 的 GraphQL 开发工具扩展,这是整个 GraphQL 数据存储:

{
  "data": {
    "resolutions": [
      {
        "_id": "AepgCCio9KWGkwyMC",
        "name": "testing 123",
        "completed": false,
        "goals": [
          {
            "_id": "TXq4nvukpLcqQhMRL",
            "name": "test goal abc",
            "completed": false,
            "__typename": "Goal"
          },
        ],
        "__typename": "Resolution"
      },
      {
        "_id": "DHSzPa8bvPCDjuAac",
        "name": "testing 345",
        "completed": false,
        "goals": [
          {
            "_id": "PEkg5oEEi2tJ6i8LH",
            "name": "goal abc",
            "completed": false,
            "__typename": "Goal"
          },
          {
            "_id": "X4H4dFzGm5gkq5bPE",
            "name": "goal bcd",
            "completed": false,
            "__typename": "Goal"
          },
          {
            "_id": "hYunrXsMq7Gme7Xck",
            "name": "goal cde",
            "completed": false,
            "__typename": "Goal"
          }
        "__typename": "Resolution"
      }
    ],
    "user": {
      "_id": "WWv57KsvqWeAoBNHY",
      "__typename": "User"
    }
  }
}

【问题讨论】:

  • 你试过没有Resolution:,因为这似乎是apollo添加到每个id的前缀。使用与查询时相同的id
  • 是的,我尝试了两种方法,在 id 中添加和不添加“Resolution:”。
  • 解析对象的 __typename 是什么?也许使用 readFragment 代替:apollographql.com/docs/react/advanced/caching.html#readfragment
  • 我通过 readQuery 寻找的对象的类型名称是“Resolution”。难道我不能单独通过 readQuery 找到它吗?
  • @Herku,非常感谢。如果您想发表您的评论作为答案,我会将其标记为已接受的答案。

标签: graphql apollo graphql-js apollo-client


【解决方案1】:

发布为有类似问题的阿波罗用户的答案:

去掉Resolution:的前缀,查询应该只取id。

那么问题来了,您的数据存储是如何填充的? 要从缓存中读取查询,之前需要在远程 API 上使用完全相同的参数调用该查询。通过这种方式,apollo 知道带有特定参数的字段的结果是什么。如果您从未使用要使用的参数调用远程端点,但知道结果会是什么,则可以通过实现缓存解析器来规避它并在本地解析查询。查看documentation 中的示例。此处商店包含书籍列表(在您的情况下为 resultions),并且可以通过简单的缓存查找来解决按 id 查询单本书。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多