Home > Net >  Can a type definition have a default value in Gatsby?
Can a type definition have a default value in Gatsby?

Time:07-29

Reading the docs on Customizing the GraphQL Schema I'm trying to see if I have frontmatter, code:

---
title: Sample Post
date: 2019-04-01
fooId:
---

is it possible to set a default value for fooId? If I live it empty in the markdown file I get:

Cannot query field "fooId" on type "MdxFrontmatter".

If you don't expect "youTubeId" to exist on the type "MdxFrontmatter" it is most likely a typo. However, if you expect "youTubeId" to exist there are a couple of solutions to common problems:

  • If you added a new data source and/or changed something inside gatsby-node/gatsby-config, please try a restart of your development server.
  • You want to optionally use your field "fooId" and right now it is not used anywhere.

It is recommended to explicitly type your GraphQL schema if you want to use optional fields.

Attempt

exports.createSchemaCustomization = ({ actions, schema }) => {
  const { createTypes } = actions
  const typeDefs = [
    'type MarkdownRemark implements Node { frontmatter: Frontmatter }',
    schema.buildObjectType({
      name: 'Frontmatter',
      fields: {
        tags: {
          type: '[String!]',
          resolve(source) {
            const { fooId } = source
            if (fooId === null) return 'foo'
            return fooId
          },
        },
      },
    }),
  ]
  createTypes(typeDefs)
}

When I implement the above code I still get the same error in the terminal. Is there a way in gatsby-node.js I can default fooId?

CodePudding user response:

Try it like this:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type MdxFrontmatter implements Node {
      fooId: String
    }
  `
  createTypes(typeDefs)
}

Is not a "default" value per se as you mention but using type definitions you are able to customize the expected outcome of the Node when fetched. By default, all (mostly) the values are set as non-nullable (in the case above as String!). Using the previous type definition, you are setting the fooId as a nullable value, meaning that is not required, without the exclamation mark, !, what represents the nullability/non-nullability, allowing the fooId to be empty.

CodePudding user response:

Just wanted to point out that if you use exports.sourceNodes in Gatsby 4.19.2:

exports.sourceNodes = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type MdxFrontmatter implements Node {
      fooId: String
    }
  `
  createTypes(typeDefs)
}

you'll get a deprecation warning which was originally posted and to prevent this issue you should use createSchemaCustomization:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions
  const typeDefs = `
    type MdxFrontmatter implements Node {
      fooId: String
    }
  `
  createTypes(typeDefs)
}
  • Related