довольно просто, так как вы знаете, что вы должны использовать 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
}
]
}