Как мне соединить два типа в GraphQL? - PullRequest
0 голосов
/ 02 октября 2019

Итак, у меня есть два типа в GraphQL:

article.mdx

---
title: "Post n.1"
category: "Category"
---

Post Content

category.json

[
  {
    "name": "Category",
    "description": "This is a description",
    "order": 1
  }
]

Я хочу запросить свой тип сообщения, чтобы получить такой результат:

{
 "node": {
   "title": Post n.1
   "category": {
     "name": "Category",
     "description": "This is a description",
     "order": 1
   }
 }
}

Как я могу это сделать? Я сейчас использую GatsbyJS! Спасибо.

1 Ответ

1 голос
/ 22 октября 2019

довольно просто, так как вы знаете, что вы должны использовать gatsby-transformer-remark для чтения md-файлов, поэтому для файлов json вы должны использовать gatsby-transformer-json, добавьте его в файл gatsby-config.js в разделе плагинов. тогда вам нужно запросить ваши данные, к сожалению, я действительно не думаю, что вы можете объединить два файла, чтобы получить данные, как вы просите, но вы можете попробовать это

сначала в файле gatsby-node.js, вам нужно обратиться к переменнымВы собираетесь использовать для фильтрации данных запроса, передать эти поля в context

exports.createPages = async function({ actions, graphql }) {
  const { data } = await graphql(`
    query {
      allMarkdownRemark {
        edges {
          node {
            fields {
              slug
            }
          }
        }
      }
    }
  `)
  data.allMarkdownRemark.edges.forEach(edge => {
    const slug = edge.node.fields.slug
    actions.createPage({
      path: slug,
      component: require.resolve(`./src/templates/article.js`),
      context: { category: category},
    })
  })
}

, а затем в своем запросе страницы вы можете получить доступ к запросу filterd, прочитав это подробнее в Создание страниц из данныхPro грамматически

export const pageQuery = graphql`
        query MyQuery($category: String!) {
          allMarkdownRemark(filter: {frontmatter: {category: {eq: $category}}}) {
            edges {
              node {
                frontmatter {
                  title
                }
              }
            }
          }
          allDataJson(filter: {name: {eq: $category}}) {
            edges {
              node {
                nodes {
                  name,
                  description,
                  order
                }
              }
            }
          }
        }`

, затем вы можете получить доступ к своим данным с помощью const {allMarkdownRemark , allDataJson} = data

, а затем объединить эти две данные, как вам нравится

const item = {node : { title: allMarkdownRemark.edges.node[0].frontmatter }};
item.node.category = allDataJson.edges.node[0].nodes

noteпри этом предполагалось, что edge.node является массивом, поэтому нам нужно точно определить 1-й элемент ваших данных по узлу [0], пожалуйста, проверьте, работает ли этот метод.

и структура данных json была

{ "nodes": [ {
     "name": "Category",
     "description": "This is a description",
     "order": 1
      } 
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...