【问题标题】:Relay edges treated as same中继边缘视为相同
【发布时间】:2017-06-03 17:03:19
【问题描述】:

尽管数据不同,但我的一些中继边缘被视为相同。

例如,我想显示推荐电影列表。这些电影是根据用户喜欢的演员这一事实推荐的。

我希望我的数据是这样的:

{
  "data": {
    "movies": {
      "edges": [
        {
          "node": {
            "name": "Cool Movie 1",
            "myActor": {
              "name": "John Smith"
            }
          },
          "node": {
            "name": "Cool Movie 1", <- Same as movie above, different actor
            "myActor": {
              "name": "Mary Smith"
            }
          }
        }
      ]
    }
  }
}

但它为两个节点返回相同的演员。

在我的 resolve() 中,我返回了一个中继连接。 是这样生成的:

let edges = movieIdAndActorIdPairs.map(({movieId, actorId}) => ({
      cursor: //,
      node: async () => {
          const dataRequirements = [getMovie(movieId), getActor(actorId)]
          let [movie, actor] = await Promise.all(dataRequirements)
          movie.myActor = actor
          return movie
      }
}))

当我记录我的edges 时,它会显示正确的myActor,但是当我在Movie 类型上记录myActor 字段时,它们都变成了John Smith

【问题讨论】:

  • 您是否已验证您在循环inside 中获得了actor 的预期值? (即在服务器上,而不是在客户端上)
  • @wincent 是的,我 console.loged 就在 Promise 下方,以及我的“电影”类型中字段“myActor”的解析器方法中,代码在此之后立即继续返回。
  • 两个电影节点的id一样吗?看起来像
  • @marktani 是的,因为它们是同一部电影……这种基于 ID 的批处理是 GraphQL 的记录功能吗?我知道 Dataloader,但在这一点上,它在堆栈中遥遥领先,不应该成为问题。这是我第一次返回这样的数据,从顶层看,数据似乎相同,但实际上传递给它们的数据不同......
  • 您可以像使用 myActor 一样拥有另一个嵌套电影

标签: graphql relayjs relay graphql-js


【解决方案1】:

单个 node 缺少 id 字段,这导致所有节点(电影)的共同 id 值。 Relay store 更新时,会存储两个具有相同 ID 和相同内容的节点。

在这里设置每个节点的id:

  node: async () => {
      const dataRequirements = [getMovie(movieId), getActor(actorId)]
      let [movie, actor] = await Promise.all(dataRequirements)
      movie.myActor = actor
      movie.id = movieId + actorId;
      return movie
  }

【讨论】:

  • 我已经尝试过了,也让我的光标像${movieId}:${actorId} 这样的组合,但它似乎仍然将它们视为相同。
【解决方案2】:

感谢所有帮助过我的人。

我已经尝试了建议的方法,但无法获得所需的数据集。

所以我采用了这种方法,其中 actorMovie 包含 actormovie 的单独字段:

{
  "data": {
    "actorMovies": {
      "edges": [
        {
          "node": {
            "movie": {
              name: "Cool Movie 1",
            },
            "myActor": {
              "name": "John Smith"
            }
          },
        }
      ]
    }
  }
}

这消除了重叠 ID 导致意外分组的担忧。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多