createNode does NOT return anything useful  📥 🏜

createNode does not return anything useful:

// gatsby-node.js

// Should be sourced or derived, only for example purposes
const DATA = { id: "unique", hello: "world" };

exports.sourceNodes = async (gatsbyUtils) => {
  const { actions, createNodeId, createContentDigest } = gatsbyUtils;
  const { createNode } = actions;

  const awaitedNode = await createNode({
    ...DATA,
    id: createNodeId(`example-node-${DATA.id}`),
    internal: {
      type: `BadExample`,
      contentDigest: createContentDigest(DATA),
    },
  });
  console.log(">>>> awaitedNode:", awaitedNode); // 👈
  // Console:
  // >>> awaitedNode: []
};

Therefore to create a child-parent link in onCreateNode for instance, you need to keep a reference to the id yourself:

// gatsby-node.js

// Should be sourced or derived, only for example purposes
const DATA = { id: "unique", hello: "world" };

exports.onCreateNode = (gatsbyUtils) => {
  const { node, actions, createNodeId, createContentDigest } = gatsbyUtils;
  const { createNode, createParentChildLink } = actions;

  if (node.internal.type !== "Parent") return;

  const nodeId = createNodeId(`example-node-${DATA.id}`); // 👈

  createNode({
    ...DATA,
    id: nodeId, // 👈
    internal: {
      type: `Child`,
      contentDigest: createContentDigest(DATA),
    },
  });

  // 👇👇👇
  createParentChildLink({ parent: node, child: { id: nodeId } });
};

A more common version of the code above that you see in examples are:

// gatsby-node.js

// Should be sourced or derived, only for example purposes
const DATA = { id: "unique", hello: "world" };

exports.onCreateNode = (gatsbyUtils) => {
  const { node, actions, createNodeId, createContentDigest } = gatsbyUtils;
  const { createNode, createParentChildLink } = actions;

  if (node.internal.type !== "Parent") return;

  const childNode = {
    ...DATA,
    id: createNodeId(`example-node-${DATA.id}`),
    internal: {
      type: `Child`,
      contentDigest: createContentDigest(DATA),
    },
  };

  // 👇👇👇
  createNode(childNode);
  createParentChildLink({ parent: node, child: childNode });
};

However, I'm not too fond of indicating that the data object describing the node is already an actual node in the data layer, so I prefer my initial solution as only the id is needed to create the link.

 

All the best,
Queen Raae

Stuck on a reef in the sharky waters around the Gatsby islands?

Book a 1-on-1 Gatsby Call with Queen Raae. Friendly advice you can put into action immediately, guaranteed!

Serious about Gatsby? Sign up for emails sent every weekday to help you get the most out of Gatsby!