You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在gatsby-source-filesystem的allDirectory查询中排除根目录

解决Gatsby查询allDirectory返回sourceInstance根目录的问题

要去掉查询结果里的dosbox根目录,只保留它的子目录,你可以在GraphQL查询的filter中添加额外条件来过滤掉根目录。这里提供几种可靠的实现方式:

1. 通过relativePath过滤(最通用推荐)

Gatsby的Directory节点中,你配置的sourceInstance根目录的relativePath是空字符串,而它的子目录会有对应的相对路径值。利用这一点,我们可以直接排除空值的relativePath条目:

query MyQuery {
  allDirectory(filter: {
    sourceInstanceName: {eq: "dosbox"},
    relativePath: {ne: ""}
  }) {
    edges {
      node {
        name
        dir
        modifiedTime
      }
    }
  }
}

这种方式不依赖目录名称或具体路径,不管你的sourceInstance目录叫什么、路径怎么变,都能稳定生效,还能避免子目录和根目录重名导致的误过滤问题。

2. 通过父目录路径过滤(精确匹配直接子目录)

如果你只需要src/dosbox/下的直接子目录,可以直接指定父目录的路径作为过滤条件:

query MyQuery {
  allDirectory(filter: {
    sourceInstanceName: {eq: "dosbox"},
    dir: {eq: "${__dirname}/src/dosbox/"}
  }) {
    edges {
      node {
        name
        dir
        modifiedTime
      }
    }
  }
}

这个方式会精确匹配父目录为src/dosbox/的目录,适合只需要一级子目录的场景。

3. 通过目录名过滤(简单但有局限性)

如果能确保不会有子目录和根目录同名(比如dosbox),也可以直接排除名字为dosbox的目录:

query MyQuery {
  allDirectory(filter: {
    sourceInstanceName: {eq: "dosbox"},
    name: {ne: "dosbox"}
  }) {
    edges {
      node {
        name
        dir
        modifiedTime
      }
    }
  }
}

注意:如果有子目录也叫dosbox,这个方式会误过滤掉它,所以只适合简单场景。

为什么原查询会返回根目录?

gatsby-source-filesystem在生成Directory节点时,会默认包含你配置的path对应的目录本身,以及它下面所有层级的子目录,所以需要手动添加过滤条件来排除根目录。

内容的提问来源于stack exchange,提问作者kevzettler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:22:48