如何根据传入参数的值有条件地应用 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? [复制]