Graphql 盖茨比海关来源一对多
我遵循源代码插件教程,在我尝试链接节点之前一切都很顺利 我的数据结构如下:Graphql 盖茨比海关来源一对多,graphql,gatsby,Graphql,Gatsby,我遵循源代码插件教程,在我尝试链接节点之前一切都很顺利 我的数据结构如下: type Genre implements Node { id: ID! itemsCount: Int imageUrl: String! name: String! items: [Movie] } type Movie implements Node { id: ID! advisory: [String]! cast: [String]!
type Genre implements Node {
id: ID!
itemsCount: Int
imageUrl: String!
name: String!
items: [Movie]
}
type Movie implements Node {
id: ID!
advisory: [String]!
cast: [String]!
title: String!
}
在我的数据获取中,我可以简单地执行以下操作
const genres = fetch(api/genres); // genres have genres.items which is an array of movies
genres.forEach(genre => createNode({ ...genre, id: createNodeId(genre.id) }));
genres.items.forEach((movie => createNode({ ...movie, id: createNodeId(movie.id) }));
所有的数据都添加正确,我可以查询所有类型和所有电影。。。但当我尝试查询类型项时,它返回null
项目
仅包含ID数组,不包含电影数组
[天真-灵感来自阿波罗本地]我希望
id
索引对象中类型
- 将
转换为项
(创建电影的数组
节点[如果不存在])电影
- 创建
节点类型
Movie
节点并注释item:[Movie]@link(from:“Movie\uuuuu节点”)
可能就足够了
您必须深入研究API或某些源插件的内部结构,或者只搜索盖茨比问题的例子
最后,它可能看起来像:
...genres.map(genre => {
const content = {
itemsCount: genre.itemsCount,
imageUrl: genre.imageUrl,
name: genre.name,
["items___NODE"]: genre.items.map(id =>
createNodeId(`Movie{${id}}`),
),
};
const id = createNodeId(`Genre{${genre.id}}`);
const nodeContent = JSON.stringify(content);
createNode({
...content,
id,
parent: null,
children: [],
internal: {
type: `Genre`,
content: nodeContent,
contentDigest: crypto
.createHash("md5")
.update(nodeContent)
.digest("hex"),
},
});
});
它的灵感来源于(自类型引用)。因此我能做的是:
type Genre implements Node {
id: ID!
itemsCount: Int
imageUrl: String!
name: String!
items: [Movie]! @link
}
type Movie implements Node {
id: ID!
advisory: [String]!
cast: [String]!
title: String!
genre: Genre @link(by: "title")
}
然后是这样的:
genres.forEach(genre => {
// save movie ids from map
const movies = genres.items.map((movie => {
// create movie node - assign genre title as a field on movie
createNode({ ...movie, genre: genre.title })
return movie.id;
});
// create genre node - assign items as an array of ids from movies
createNode({ ...genre, items: movies });
});
There was no need to use gatsby id as my id's were unique already. Here my linking is done from Genre to Movie using @link ( it defaults to using id as the key ) and then from Movie to Genre using @link(by: "title") where I have specified to use the title attribute as the key
所以我实际上尝试了这个(但是向后引用了一部电影的类型,比如我可以做的
movie.genre.title
当我映射我的电影时,我添加了一个genre:genre.id
字段,然后在type added:genre:genre@Link
中,甚至返回null://genre:createNodeId(
genre{${genre.id})
?您需要使用盖茨比节点ID,而不是原始的节点ID(用于关系),因此在“@link”时代之前,我的解决方案是好的;)。。。通过id
,而不是通过title
,链接流派
,不是更自然吗?这看起来是多余的