graphql,如何按第一个节点名称过滤?

时间:2019-02-27 09:38:42

标签: gatsby graphql-js

如果我有graphQL个节点,例如

allFile {
  edges {
  ...
  }
}
name1 {...}
name2 {...}

如何过滤name1name2

如果我可以将name1作为变量传递,那么由于它们是第一个节点,我该怎么做?

换句话说,通常的方式是

allFile (filter: {extension: {eq: "jpg"} }){
 edges {
  nodes {
   name
  }
 }
}

但是如果我想要类似的东西怎么办

(filter: {eq: "name1"}){
 edges {
  nodes {
   name
  }
 }
}

或直接

query ($name: String) {
  $name {
    edges {
      node {
        name
        message
      }
    }
  }
}

但似乎不可能(?)


编辑

我会尽力解释自己。如果我有这棵树:

AllMyPluginNodes {
  edges {
    node {
     name

我可以过滤具有特定扩展名(照常营业)的该节点的所有节点。

问题是“ AllMyPluginNodes”的名称正在更改,例如

MyName1Nodes {
 edges {
...
MyName2Nodes {
  edges {
...
MyName3Nodes {
  edges {
...

我知道所有这些名称,所以我想专门查询这些名称。

在第一种情况下,我将执行类似AllMyPluginNodes(filter: { extension: { eq: "yml" } })的操作来检索yml节点下的所有AllMyPluginNodes文件,但是现在,我该怎么做?

MyName1Nodes (filter: { extension: { eq: "yml" } })

这显然可行,但是我希望MyName1Nodes是一个变量,这不是问题,因为我可以通过createPages上下文传递变量。问题是,一旦有了此变量,如果这是一个“根”节点或“主”节点,如何使用它查询MyName1Nodes?有可能吗?

我可以做类似的事情

query($ext: String) {
MyName1Nodes (filter: { extension: { eq: $ext } })`

但是我不能做这样的事情

query($ext: String, $name: String) {
$name (filter: { extension: { eq: $ext } })`

可以吗?

2 个答案:

答案 0 :(得分:0)

You can pass variables that can be queried via context

  

自动创建的页面可以接收上下文并将其用作其GraphQL查询中的变量。

在创建页面的&VecDeque中,尝试将gatsby-node.js字段添加到页面的上下文中。

name

在上下文中,您可以在graphql查询中查询createPage({ path: `/${ edge.node.uid }`, component: postTemplate, context: { uid: edge.node.uid, name: name } })

name

此外,您还可以通过query PostByName($name: String!) { allMyPosts(filter: { name: { eq: $name } }) { edges { node { id data ... } } } } 属性访问模板中的name

pageContext

答案 1 :(得分:0)

无法在另一个查询中使用页面查询的结果。 Gatsby在评估页面之前通过静态分析提取您的GraphQL查询,因此变量不可用。这对于让您的网站编译为不依赖于GraphQL服务器运行(仅在构建期间运行)的静态服务器端渲染页面非常重要。

如果您要基于GraphQL查询的结果生成页面或其他效果,您可以按照@ksav概述的操作进行操作:在{{1}内运行一个(或多个)查询},然后针对它们中的每一个调用createPages,将生成的createPage作为上下文传递,使其可以在页面查询中用作变量。