graphql, как фильтровать по самому первому имени узла? - PullRequest
0 голосов
/ 27 февраля 2019

Если у меня есть graphQL узлы, такие как

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

, как я могу фильтровать по name1 и name2?

Если я могу передать 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 голосов
/ 27 февраля 2019

Нет способа использовать результаты запроса страницы внутри другого запроса.Gatsby извлекает ваши запросы GraphQL с помощью статического анализа до оценки страницы, поэтому переменные недоступны.Это важно для того, чтобы ваш веб-сайт мог компилироваться до статических, отображаемых на стороне сервера страниц, которые не зависят от сервера GraphQL, работающего (он работает только во время сборки).

Вы можете делайте как @ksav, как описано выше, если вы хотите генерировать страницы или другие эффекты на основе результатов запроса GraphQL: выполните запрос (или несколько) внутри createPages и затем вызовите createPage для каждого из них, передавая полученный name в качестве контекста, позволяя использовать его в качестве переменной в запросе страницы.

0 голосов
/ 27 февраля 2019

Вы можете передавать переменные, которые могут запрашиваться через контекст .

Автоматически созданные страницы могут получать контекст и использовать его в качестве переменных в своих запросах GraphQL.

В gatsby-node.js при создании страницы попробуйте добавить поле name в контекст страницы.

createPage({
  path: `/${ edge.node.uid }`,
  component: postTemplate,
  context: {
    uid: edge.node.uid,
    name: name
  }
})

Как только он попадет в контекст, вы можете запросить name в ваших запросах graphql.

query PostByName($name: String!) {
  allMyPosts(filter: { name: { eq: $name } }) {
    edges {
      node {
        id
        data
        ...
      }
    }
  }
}

Кроме того, вы можете получить доступ к name в своем шаблоне через pageContext проп.

import React from "react"

const Page = ({ pageContext }) => {
  return <div>{pageContext.name}</div>
}

export default Page
...