Gatsby: Building fails because fetch is not defined

Created on 23 Nov 2017  路  13Comments  路  Source: gatsbyjs/gatsby


gatsby-config.js

require(`dotenv`).config();

module.exports = {
  siteMetadata: {
    author: `Thibault Maekelbergh`,
    keywords: `thibault maekelbergh, thibmaek, blog`,
    title: `A nice blog about development, Raspberry Pi, plants and probably records`,
    social: {
      github: `thibmaek`,
      twitter: `thibmaek`,
    },
  },
  plugins: [
    `gatsby-plugin-react-helmet`,
    `gatsby-transformer-remark`,
    {
      resolve: `gatsby-source-contentful`,
      options: {
        accessToken: process.env.CONTENTFUL_TOKEN,
        spaceId: process.env.CONTENTFUL_SPACEID,
      },
    },
  ],
};


gatsby-node.js

const path = require(`path`);

const postTemplate = path.resolve(`./src/templates/post.jsx`);

exports.createPages = ({ graphql, boundActionCreators }) => {
  const { createPage } = boundActionCreators;

  return new Promise(async (resolve, reject) => {
    try {
      const posts = await graphql(`
        {
          allContentfulPost(limit: 1000) {
            edges {
              node {
                id
                slug
              }
            }
          }
        }
      `);

      if (posts.errors) reject(posts.errors);

      posts.data.allContentfulPost.edges.forEach(edge => {
        createPage({
          component: postTemplate,
          context: {
            id: edge.node.id,
            slug: edge.node.slug,
          },
          path: `/post/${edge.node.slug}/`,
        });
      });

      resolve();
    } catch (e) {
      console.error(e);
      reject(e);
    }
  });
};

Trying to run gatsby build fails because it can not find fetch:

error Building static HTML for pages failed

See our docs page on debugging HTML builds for help https://goo.gl/yL9lND

  12 | 
  13 |   componentWillMount() {
> 14 |     fetch(process.env.GATSBY_RECENT_REPOS_URL)
     |     ^
  15 |       .then(r => r.json())
  16 |       .then(repos => {
  17 |         this.setState({ repos: repos.reverse() });


  WebpackError: fetch is not defined

  - index.jsx:14 RecentRepos.componentWillMount
    src/components/recent-repos/index.jsx:14:5

  - ReactCompositeComponent.js:348 ReactCompositeComponentWrapper.performInitialMount
    ~/react-dom/lib/ReactCompositeComponent.js:348:1

  - ReactCompositeComponent.js:255 ReactCompositeComponentWrapper.mountComponent
    ~/react-dom/lib/ReactCompositeComponent.js:255:1

  - ReactReconciler.js:43 Object.mountComponent
    ~/react-dom/lib/ReactReconciler.js:43:1

I tried polyfilling this with unfetch, node-fetch, isomorphic-fetch, whatwg-fetch and none of these worked. I think it might be an issue, if not where do I start to fix this?

Most helpful comment

If you don't need polyfill for IE, you may use this code without isomorphic-fetch

typeof window !== 'undefined' && window.fetch(...)
  .then(...)
  .catch(...)

All 13 comments

Try importing fetch instead of doing a polyfill.

@KyleAMathews Tried both import 'isomorphic-fetch' and import fetch from 'ismorphic-fetch'

Did this with node-fetch, whatwg-fetch, isomorphic-fetch and unfetch. None of them seemed to work

@thibmaek you may use axios instead of fetch.

@calpa I might, but that's really not a solution though but an alternative. Seems weird that I could use all the nice ES6 & ESNext stuff out of the box with Gatsby, but I shouldn't use a widely supported API in the official Javascript spec.

@calpa I tried it out with axios but the same deal:

error Building static HTML for pages failed

See our docs page on debugging HTML builds for help https://goo.gl/yL9lND

  27 |   message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';
  28 | 
> 29 |   var error = new Error(message);
     | ^
  30 |   error.name = 'Invariant Violation';
  31 |   error.framesToPop = 1; // we don't care about reactProdInvariant's own frame
  32 | 


  WebpackError: Minified React error #130; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=130&args[]=object&a  rgs[]= for the full message or use the non-minified dev environment for full errors and additional helpful warnings.

which results in this:

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.[missing argument]

Works fine in dev for this endpoint: https://gh-latest-repos-ohdfptbedm.now.sh/

Seems like I was able to build using isomorphic-fetch to polyfill fetch not being defined. The last error was related to placeholder files in pages/ which were empty or did not export a valid React component.

If you don't need polyfill for IE, you may use this code without isomorphic-fetch

typeof window !== 'undefined' && window.fetch(...)
  .then(...)
  .catch(...)

@kodepareek this wasn't ever an issue with Gatsby code. If you're seeing this issue with builds, try one of the above solutions on your code.

Does anyone know how to integrate the whatwg-fetch library in gatsby?

What I have done so far is import 'whatwg-fetch'; in the gatsby-browser.js. Now I'm not sure how to add it as a first element in the webpack's entry property presumably in the gatsby-node.js.

@kilgarenone you need to import it into the modules that you're using fetch e.g. import fetch from 'whatwg-fetch'

Oh that's it? I don't have to do any of the steps suggested here https://github.com/github/fetch#installation other than the npm install?

EDIT: Doesn't seem to work. It gives me e.response is undefined error

Hopefully, the following helps someone out; it took me a while.

I was struggling today with implementing a simple request with whatwg-fetch. After seeing some errors between develop & build I used
import { fetch as fetchPolyfill } from 'whatwg-fetch';.

When using v3.0.0, fetchPolyfill under develop works correctly, but during build stops on:

TypeError: Cannot read property 'path' of undefined

  - build.js:68 buildHTML.catch.err
    [my-site]/[gatsby]/dist/commands/build.js:68:72

    [... error chain continues]

When I try to downgrade to v2.0.4, (c.f. PR https://github.com/pinvite/pinvite/pull/23 referenced in https://github.com/gatsbyjs/gatsby/issues/8612) build succeeds but in develop the browser throws:

TypeError: Object(...) is not a function

 componentDidMount() {
> 61 |   fetchPolyfill('/.netlify/functions/getCustomer')
  62 |     .then(res => res.json())
  63 |     .then(json => {
  64 |       this.setState({

Unfortunately I couldn't use isomorphic-fetch either on account of its dependancy on whatwg-fetch. https://github.com/matthew-andrews/isomorphic-fetch/issues/174

However, fetch-ponyfill didn't throw any errors in either build nor develop so that ended up being my solution for now. I'd love to know if anyone has figured out a different and stable approach that might be more widely-accepted.

(I'm using gatsby v2.0.106)

You could do something like this using React Context ("outside" of Gatsby - client side)

Isomorphic Fetch - with React hook

Was this page helpful?
0 / 5 - 0 ratings

Related issues

brandonmp picture brandonmp  路  3Comments

rossPatton picture rossPatton  路  3Comments

andykais picture andykais  路  3Comments

dustinhorton picture dustinhorton  路  3Comments

magicly picture magicly  路  3Comments