Вы можете попробовать использовать внешние ключи , чтобы связать узлы.
В ваш файл gatsby-node.js
вам нужно добавить ключ, добавленный к ___NODE
с идентификатором узла sys
для ссылки:
exports.sourceNodes = async ({ getNodes, actions, createContentDigest }) => {
// find all the sys nodes - you'll need to alter this filter to get the right one
const sysNodes = getNodes().filter(node => node.internal.type === 'File');
// go through the posts to map the sys nodes
// these nodes may already exist, so you could filter `getNodes` like above
const postData = howeverYouGetDataFromContentful();
postData.forEach(post => {
const sys = sysNodes.find(embedded => embedded.id === post.data.target.embedded.id);
// This will create a brand-new node.
// If your posts already exist, then use `createNodeField` mentioned below
const node = {
id: post.id,
children: [],
internal: {
type: 'post',
mediaType: 'text/json',
contentDigest: createContentDigest(JSON.stringify(post))
},
sys___NODE: sys.id
};
actions.createNode(node);
});
}
Если к моменту вызова sourceNodes
узлы уже существуют (что они, вероятно, будут с Contentful), то вы можете отфильтровать их, используя getNodes
. Вам также, вероятно, нужно будет использовать createNodeField
вместо createNode
, как указано здесь:
https://github.com/gatsbyjs/gatsby/issues/3129#issuecomment-360927436, чтобы избежать воссоздания узлов.