Я создаю сайт Stati c на базе Gatsby, который использует документы уценки в качестве источника контента.
Структура контента
/content/{section}
/index.md
/{slug}
/detail.md
/summary.md
Авторы контента добавляют frontmatter
теги к index.md
, которые включают тег links
, как указано ниже:
links:
- some-awesome-slug
- some-other-slug
Я бы хотел, чтобы на этапе, когда Гэтсби собирал свой граф узлов, чтобы поменять слаг ссылки для блок данных, созданный из ссылки на фактический узел summary.md
, или, если его там нет, то метаданные выдержки detail.md
. Поэтому я думаю, что мне нужен пользовательский тип.
My gatsby-node.js
экспортирует функцию createSchemaCustomization
следующим образом, просто для того, чтобы заставить что-то работать: (Так что для простоты сейчас пропущен бит пользовательского типа) .
const createSchemaCustomization = ({ actions: { createTypes }, schema }) => {
const typeDefs = [
'type MarkdownRemark implements Node { frontmatter: Frontmatter }',
schema.buildObjectType({
name: 'Frontmatter',
fields: {
summary: {
type: 'MarkdownRemark',
resolve: (source, args, context, info) => {
// source here is the existing frontmatter, but I need access to the node's `fields` data.
return context.nodeModel
.getAllNodes({ type: 'MarkdownRemark' })
.find(() => false) // while I work this out.
}
}
},
interfaces: ['Node']
})
]
createTypes(typeDefs)
}
, где отсутствует бит, в котором я использую данные section
узла (вставленные ранее в fields
) и значение slug
(также ранее вставленное в fields
) для поиска связанный сводный или подробный файл.
Значение source
, которое Гэтсби отправляет функции resolve
, представляет собой всего лишь frontmatter
, поэтому функция не имеет ссылки на узел, который я могу найти.
Результатом net будет то, что frontmatter
для узла будет заменено следующим образом
С:
links:
- some-slug
Кому:
links:
- id: xxxx
frontmatter:
title: Some Slug
summary: # this either comes from a summary.md file or from the `excerpt` of a `detail.md` file.
title: Some Summary
text: Some summary text
html
fields: # populated previously to the `createSchemaCustomization` step (I think)
section: someSection
slug: some-slug
Is то, что я пытаюсь сделать разумно, или это то, что мне лучше сделать в компоненте React уровня страницы, просто создать запрос graphql
из значений ссылок.