首页 > 解决方案 > Gatsby sourceNode 不适用于 GraphQL 参数

问题描述

目前我正在尝试从 API 中提取一些数据并使用 sourceNode 和 createNode API 添加到 GraphQL,如下所示:

exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => {
const modules = ['data', 'stuff', 'bananas'];
const modulesResponse = Promise.all(modules.map(async (module) => getModuleData(module)));
const modulesData = await modulesResponse;

const content = Object.fromEntries(modules.map((entries, index) => [entries, modulesData[index]]));

actions.createNode({
    id: createNodeId(modules.join(',')),
    parent: null,
    children: [],
    content,
    internal: {
        type: 'myData',
        mediaType: 'text/html',
        contentDigest: createContentDigest(content)
    }
});

当我尝试使用参数过滤这个(使用 GraphiQL)时,它似乎不起作用:

{
  myData(content: {data: {elemMatch: {filterEntry: {eq: "foo"}}}}) {
    content {
      data {
        filterEntry
      }
    }
  }
}

结果是:

{
  "data": {
    "myData": {
      "content": {
        "data": [
          {
            "filterEntry": "foo"
          },
          {
            "filterEntry": "bar"
          },
          {
            "filterEntry": "baz"
          }
        ]
      }
    }
  }
}

标签: gatsbygraphql-js

解决方案


所以我找到了一个解决方案。问题在于要过滤的数据是内容对象的条目。这意味着它们没有 NodeId 并且不可过滤。解决方案是添加一个action.createNode来自 API 的 foreach 条目,而不是大量添加。


推荐阅读