如果过滤器变量为空,GraphQL 将禁用过滤

Cas*_*mir 5 contentful graphql graphql-js gatsby

我有一个 Gatsby GraphQL 查询,用于获取按日期排序并按类别过滤的帖子列表。

{
  posts: allContentfulPost(
    sort: {fields: [date], order: DESC},
    filter: {category: {slug: {eq: $slug}}}
  ) {
    edges {
      node {
        title {
          title
        }
        date
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在什么时候$slug是空字符串"",我明白了

{
  "data": {
    "posts": null
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法获取所有帖子?

Mat*_*ocz 6

您可以使用正则表达式过滤器来发挥您的优势。如果您传递空表达式,则将返回所有帖子,因为所有内容都会匹配。

query Posts($slugRegex: String = "//"){
  posts: allContentfulPost(
    sort: {fields: [date], order: DESC},
    filter: {category: {slug: {eq: $slugRegex}}}
  ) {
    # Rest of the query.
  }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,将返回所有帖子($slugRegex如果未传递任何内容,则为空正则表达式)。当$slugRegex成为有意义的表达式时,只会显示匹配的帖子。

至于传递值,我假设您正在使用它gatsby-node.js来创建页面。在这种情况下,事情就这么简单:

query Posts($slugRegex: String = "//"){
  posts: allContentfulPost(
    sort: {fields: [date], order: DESC},
    filter: {category: {slug: {eq: $slugRegex}}}
  ) {
    # Rest of the query.
  }
}
Run Code Online (Sandbox Code Playgroud)