如何根据传入参数的值有条件地应用 GraphQL 过滤器?

Posted

技术标签:

【中文标题】如何根据传入参数的值有条件地应用 GraphQL 过滤器?【英文标题】:How to conditionally apply a GraphQL filter based on the value of a passed in argument? 【发布时间】:2019-05-05 04:40:42 【问题描述】:

更新:对于我的特定用例,@langpavel 的解决方案将起作用。但是,它避免回答原始问题... 是否可以根据传入参数的值有条件地应用 GraphQL 过滤器?

我正在将一个名为 $env 的参数传递到我的 GraphQL 查询中,我想在我的博客文章的降价前文中将它与 draft 布尔值结合使用,以便在生产期间过滤掉草稿。

下面是我的缩写形式的查询。如您所见,我有一个过滤器功能,它根据博客文章是否为草稿进行过滤。我不知道该怎么做是利用$env 参数仅在$env 等于production 时应用过滤器。

export const pageQuery = graphql`
  query BlogPosts($env: String!) 
    markdownRemark(
      filter:  frontmatter:  draft:  eq: true   
    ) 
      frontmatter 
        title
        date(formatString: "MMMM DD, YYYY")
        draft
      
    
  
`

【问题讨论】:

【参考方案1】:

在 gatsby 的情况下,您可能应该编写两个查询并根据process.env.NODE_ENV 有条件地选择一个:

export const pageQuery = (process.env.NODE_ENV === 'production') ?
graphql`
  query BlogPosts 
    markdownRemark(
      filter:  frontmatter:  draft:  ne: true   
    )  frontmatter  ...  
  
` : graphql`
  query BlogPosts 
    markdownRemark  frontmatter  ...  
  
`

【讨论】:

好主意,但不幸的是,在 Gatsby 运行时提取和处理您的 GraphQL 查询时,节点环境(例如 process.env)不可用 是的,他们和process.env.NODE_ENV 特别是:gatsbyjs.org/docs/environment-variables/… 这不行,盖茨比告诉你,如果你尝试这个答案,你有多个根查询正在开发中。【参考方案2】:

您提供的 GraphQL 查询无效,因为 $env 变量未在任何字段中使用。我认为出于您的目的,$env 最好在 GraphQL 查询之外传递。如果您通过 HTTP 提供 GraphQL,则可以将其作为查询参数或 HTTP 标头发送。然后,您可以使用大多数 GraphQL 库提供的 context 概念将值传递给您的 GraphQL 解析器。

【讨论】:

嗨,罗伯。不幸的是,由于 Gatsby 运行时处理 GraphQL 查询的方式,过滤必须从查询本身内部进行。诚然,我提供的查询在技术上可能无效,但这仅仅是因为我出于演示目的包含了 $env 参数。如果可能的话,我希望这里有人可以帮助我如何正确使用 $env 和过滤器

以上是关于如何根据传入参数的值有条件地应用 GraphQL 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据数据框中的值有条件地对数据进行分组?

如何根据 s-s-rS 中单独字段的值有条件地格式化整行的文本颜色?

根据三列的值有条件地和交互地计算列

Javascript:根据键的值有条件地过滤 JSON? [复制]

ReactJS 7 - 如何根据其值有条件地仅更改表格单元格(而不是行)的背景颜色?

根据外部值有条件地应用管道步骤