【发布时间】: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