盖茨比自定义来源一对多

时间:2020-06-05 06:43:17

标签: 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]!
    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) }));

所有数据均已正确添加,我可以查询allGenres和allMovies ...,但是当我尝试查询类型项目时,它返回null;

2 个答案:

答案 0 :(得分:1)

items仅包含ID数组,而不包含Movies

数组

[天真-受阿波罗当地人的启发]

  1. 将电影收集到索引为id的对象中。
  2. 每个genre
    • items转换为Movies的数组(创建movie个节点(如果不存在))
    • 创建genre节点

...但是[我很天真吗?]首先创建Movie节点并注释item: [Movie] @link(from: "Movie___NODE")就足够了。

您必须深入研究API或某些源插件的内部,或者仅搜索gatsby问题作为示例。

最后它应该看起来像:

...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"),
    },
  });
});

它受到this use case(自类型引用)的启发。

答案 1 :(得分:0)

所以事实证明我可以做的是:

String b64 = Convert.Tobase64String(originalCert.RawData);

然后类似:

Byte[] rawData = Convert.FromBase64String(b64);