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
    ,链接
    流派
    ,不是更自然吗?这看起来是多余的