Gatsby sourceNode 不适用于 GraphQL 参数

Posted

技术标签:

【中文标题】Gatsby sourceNode 不适用于 GraphQL 参数【英文标题】:Gatsby sourceNode does not work with GraphQL arguments 【发布时间】:2020-07-19 07:24:05 【问题描述】:

目前我正在尝试从 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"
          
        ]
      
    
  

【问题讨论】:

我不确定您的 graphql 语法是否正确?我相信过滤器总是写成filter: 而不是content: 。 gatsbyjs.org/docs/graphql-reference/#filter 我也不确定,但是当通过 gatsby 创建的另一个节点时,它也有过滤选项也不起作用 【参考方案1】:

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

【讨论】:

以上是关于Gatsby sourceNode 不适用于 GraphQL 参数的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 查询适用于 Gatsby 页面,但不适用于类组件

malihu 自定义滚动条插件不适用于 Electron.js

模式中不存在的 Gatsby `S3Object`。在添加解析器之前使用`createTypes`添加类型

用于样式化组件和 Gatsby / Safari 支持的 Gap Polyfill

将 Gatsby.js 用于动态和静态 Web 应用程序

您可以将 Gatsby 和 Next js 用于单个 React js 网站吗?