ReferenceError: fetch is not defined

Javascriptnode.js

Javascript Problem Overview


I have this error when I compile my code in node.js, how can I fix it?

RefernceError: fetch is not defined

enter image description here

This is the function I am doing, it is responsible for recovering information from a specific movie database.

function getMovieTitles(substr){  
  pageNumber=1;
  let url = 'https://jsonmock.hackerrank.com/api/movies/search/?Title=' + substr + "&page=" + pageNumber;
  fetch(url).then((resp) => resp.json()).then(function(data) {
    let movies = data.data;
    let totPages = data.total_pages;
    let sortArray = [];
    for(let i=0; i<movies.length;i++){
        sortArray.push(data.data[i].Title);
     }
    for(let i=2; i<=totPages; i++){
           let newPage = i;
           let url1 = 'https://jsonmock.hackerrank.com/api/movies/search/?Title=' + substr + "&page=" + newPage;
          
          fetch(url1).then(function(response) {
              var contentType = response.headers.get("content-type");
              if(contentType && contentType.indexOf("application/json") !== -1) {
                return response.json().then(function(json) {
                  //console.log(json); //uncomment this console.log to see the JSON data.
                
                 for(let i=0; i<json.data.length;i++){
                    sortArray.push(json.data[i].Title);
                 }
                  
                 if(i==totPages)console.log(sortArray.sort());
                
                });
              } else {
                console.log("Oops, we haven't got JSON!");
              }
            });
            
        }
  })
  .catch(function(error) {
    console.log(error);
  });   
}

Javascript Solutions


Solution 1 - Javascript

The fetch API is not implemented in Node.

You need to use an external module for that, like node-fetch.

Install it in your Node application like this

npm install node-fetch

then put the line below at the top of the files where you are using the fetch API:

import fetch from "node-fetch";

Solution 2 - Javascript

This is a quick dirty fix, please try to eliminate this usage in production code.

If fetch has to be accessible with a global scope

import fetch from 'node-fetch'
globalThis.fetch = fetch

Solution 3 - Javascript

You can use cross-fetch from @lquixada

> Platform agnostic: browsers, node or react native

Install

npm install --save cross-fetch

Usage

With promises:

import fetch from 'cross-fetch';
// Or just: import 'cross-fetch/polyfill';

fetch('//api.github.com/users/lquixada')
  .then(res => {
    if (res.status >= 400) {
      throw new Error("Bad response from server");
    }
    return res.json();
  })
  .then(user => {
    console.log(user);
  })
  .catch(err => {
    console.error(err);
  });

With async/await:

import fetch from 'cross-fetch';
// Or just: import 'cross-fetch/polyfill';

(async () => {
  try {
    const res = await fetch('//api.github.com/users/lquixada');
    
    if (res.status >= 400) {
      throw new Error("Bad response from server");
    }
    
    const user = await res.json();
  
    console.log(user);
  } catch (err) {
    console.error(err);
  }
})();

Solution 4 - Javascript

If you want to avoid npm install and not running in browser, you can also use nodejs https module;

const https = require('https')
const url = "https://jsonmock.hackerrank.com/api/movies";
https.get(url, res => {
  let data = '';
  res.on('data', chunk => {
    data += chunk;
  });
  res.on('end', () => {
    data = JSON.parse(data);
    console.log(data);
  })
}).on('error', err => {
  console.log(err.message);
})

Solution 5 - Javascript

Node.js hasn't implemented the fetch() method, but you can use one of the external modules of this fantastic execution environment for JavaScript.

In one of the other answers, "node-fetch" is cited and that's a good choice.

In your project folder (the directory where you have the .js scripts) install that module with the command:

npm i node-fetch --save

Then use it as a constant in the script you want to execute with Node.js, something like this:

const fetch = require("node-fetch");

Solution 6 - Javascript

You should add this import in your file:

import * as fetch from 'node-fetch';

And then, run this code to add the node-fetch:
$ yarn add node-fetch

If you're working with typescript, then install node-fetch types:
$ yarn add @types/node-fetch

Solution 7 - Javascript

You have to use the isomorphic-fetch module to your Node project because Node does not contain Fetch API yet. For fixing this problem run below command:

npm install --save isomorphic-fetch es6-promise

After installation use below code in your project:

import "isomorphic-fetch"

Solution 8 - Javascript

EDITED - New Solution

To use the latest version (3.0.0) you must do the import like this:

const fetch = (url) => import('node-fetch').then(({default: fetch}) => fetch(url));


Old Anwser:

This may not be the best solution, but if you install this version :

npm install node-fetch@1.7.3

you can now use the line below without error's.

const fetch = require("node-fetch");

Solution 9 - Javascript

Best one is Axios library for fetching. use npm i --save axios for installng and use it like fetch, just write axios instead of fetch and then get response in then().

Solution 10 - Javascript

For those also using typescript on node-js and are getting a ReferenceError: fetch is not defined error

npm install these packages:

    "amazon-cognito-identity-js": "3.0.11"
    "node-fetch": "^2.3.0"

Then include:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');

Solution 11 - Javascript

It seems fetch support URL scheme with "http" or "https" for CORS request.

Install node fetch library npm install node-fetch, read the file and parse to json.

const fs = require('fs')
const readJson = filename => {
  return new Promise((resolve, reject) => {
    if (filename.toLowerCase().endsWith(".json")) {
      fs.readFile(filename, (err, data) => {
        if (err) {
          reject(err)
          return
        }
        resolve(JSON.parse(data))
      })
    }
    else {
      reject(new Error("Invalid filetype, <*.json> required."))
      return
    }
  })
}

// usage
const filename = "../data.json"
readJson(filename).then(data => console.log(data)).catch(err => console.log(err.message))

Solution 12 - Javascript

In node.js you can use : node-fetch package

npm i node-fetch

then :

import fetch from 'node-fetch';

here is a full sample in (nodejs) :

import fetch from "node-fetch";

const fetchData = async () => {
  const res = await fetch("https://restcountries.eu/rest/v2/alpha/col"); // fetch() returns a promise, so we need to wait for it

  const country = await res.json(); // res is now only an HTTP response, so we need to call res.json()

  console.log(country); // Columbia's data will be logged to the dev console
};

fetchData();

Solution 13 - Javascript

fetch came to Node v17 under experimental flag --experimental-fetch

It will be available in Node v18 without the flag.

https://github.com/nodejs/node/pull/41749#issue-1118239565

You no longer need any additional package to be installed

Solution 14 - Javascript

In HackerRank, some libraries are installed by default and some are not.

Because it is running Node.js, the fetch API is not installed by default.

The best thing for you to do is to check whether the libraries are or not installed.

on the top of the exercise, there is the following:

const https = require('https');

Please try to add this to the top as well:

const axios = require('axios');

and then run the code.

If there is a compilation error, then it's not available, otherwise you can use axios, which is a good alternative to fetch

To use it with then, you can:

function getMovieTitles(substr){
  axios.get(url)
    .then(function(response){
      console.log(response.data);
    })
}

or taking advantage of the async/await

async function getMovieTitles(substr){
  let response = await axios.get(url)
  console.log(response.data);
}

Solution 15 - Javascript

This is the related github issue This bug is related to the 2.0.0 version, you can solve it by simply upgrading to version 2.1.0. You can run npm i [email protected]

Solution 16 - Javascript

The following works for me in Node.js 12.x:

npm i node-fetch;

to initialize the Dropbox instance:

var Dropbox = require("dropbox").Dropbox;
var dbx = new Dropbox({
   accessToken: <your access token>,
   fetch: require("node-fetch")    
});

to e.g. upload a content (an asynchronous method used in this case):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});

Solution 17 - Javascript

For me these are looking more simple.

npm install node-fetch
import fetch from "node-fetch";

Solution 18 - Javascript

There are actually a lot of different libraries for making fetch available in the browser.

The main ones I'm aware of are:

I currently use node-fetch, and it has worked fine, but I don't really know which one is "the best". (though the openbase.com pages I linked to provide some metadata on usage [eg. Github stars, npm downloads], which can help)

Solution 19 - Javascript

This answer does not directly answer this question. Instead it suggests for an alternative.

Why? Because the using 'node-fetch' is getting complicated since you cannot import the updated versions using const fetch = require('node-fetch') . You will have to do more things to just make it work.

Try using axios package:

  1. Simple installation npm i axios
  2. code for fetching goes like
const response = await axios.get(url).then(res => res.data)

Solution 20 - Javascript

Just make your app.js file Extension as app.mjs and the problem will be solved!!!:)

Solution 21 - Javascript

If need install:

npm install --save global-fetch

then

var fetch = require("node-fetch");

Solution 22 - Javascript

Might sound silly but I simply called npm i node-fetch --save in the wrong project. Make sure you are in the correct directory.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionjasa1704View Question on Stackoverflow
Solution 1 - JavascriptAdrian TheodorescuView Answer on Stackoverflow
Solution 2 - JavascriptX.CreatesView Answer on Stackoverflow
Solution 3 - JavascriptRichard VergisView Answer on Stackoverflow
Solution 4 - JavascriptKhuram NiazView Answer on Stackoverflow
Solution 5 - JavascriptMiguel MurilloView Answer on Stackoverflow
Solution 6 - Javascriptofir_aghaiView Answer on Stackoverflow
Solution 7 - JavascriptAmerllicAView Answer on Stackoverflow
Solution 8 - JavascriptRafael LourençoView Answer on Stackoverflow
Solution 9 - JavascriptMohammad QuanitView Answer on Stackoverflow
Solution 10 - JavascriptclosedloopView Answer on Stackoverflow
Solution 11 - JavascriptExpert NgobeniView Answer on Stackoverflow
Solution 12 - JavascriptMasoud EhteshamiView Answer on Stackoverflow
Solution 13 - JavascriptLearningToCodeView Answer on Stackoverflow
Solution 14 - JavascriptnabaisView Answer on Stackoverflow
Solution 15 - JavascriptasmaView Answer on Stackoverflow
Solution 16 - JavascriptPavel MuzikView Answer on Stackoverflow
Solution 17 - JavascriptYeonCheol JangView Answer on Stackoverflow
Solution 18 - JavascriptVenryxView Answer on Stackoverflow
Solution 19 - JavascriptPiyush AggarwalView Answer on Stackoverflow
Solution 20 - Javascript19_520 KarthikeyaView Answer on Stackoverflow
Solution 21 - Javascriptuser14334029View Answer on Stackoverflow
Solution 22 - JavascriptJFMView Answer on Stackoverflow