javascript - ReferenceError: fetch är inte definierad


Jag får detta fel när jag kompilerar min kod i node.js, hur kan jag åtgärda det?

ReferenceError: fetch är inte definierad

Detta är funktionen jag gör, den är ansvarig för att återställa information från en specifik filmdatabas.

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);
  });   
}

Svar #1

Om du använder en version av Node före 18 är fetch-API:et inte implementerat direkt och du måste använda en extern modul för det, som node-fetch.

Installera det i din Node-applikation så här

npm install node-fetch

lägg sedan raden nedan högst upp i de filer där du använder fetch API:

import fetch from "node-fetch";

Om din applikation inte kan uppdateras för att använda ESM (även kallat import-syntax), och du behöver använda CommonJS (även kallat require), bör du fortsätta med v2 av node-fetch. Enligt deras README kommer v2 fortsätta att få kritiska buggfixar.

npm install node-fetch@2

och då kommer detta att fungera,

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

Svar #2

Detta är en snabb och enkel lösning, försök att eliminera denna användning i produktionskod.

Om fetch måste vara tillgänglig med global räckvidd

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

Svar #3

Du kan använda cross-fetch från @lquixada

Plattformsoberoende: webbläsare, Node eller React Native

Installera

npm install --save cross-fetch

Användning

Med löften:

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);
  });

Med 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);
  }
})();

Svar #4

Om du vill undvika npm install och inte köra i webbläsaren, kan du också använda Node.js https-modulen;

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);
})

Från och med Node version 18 är Fetch API tillgängligt (Stabil i version 21.x) https://nodejs.org/docs/latest-v21.x/api/globals.html#fetch

// Promise version:

const url = "https://jsonmock.hackerrank.com/api/movies";

fetch(url).then(res => {
    return res.json();
}).then(data => {
    console.log('DATA: ', data);
})

ELLER

// async/await version

const url = "https://jsonmock.hackerrank.com/api/movies";

const getData = async () => {
    const response = await fetch(url);

    if (response.ok) {
        const data = await response.json();

        console.log('DATA: ', data);
    }
};
getData();

Svar #5

fetch kom till Node v17 under den experimentella flaggan --experimental-fetch

Det kommer att vara tillgängligt i Node v18 utan flaggan.

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

Du behöver inte längre installera något ytterligare paket

Svar #6

REDIGERAD - Ny lösning

För att använda den senaste versionen (3.0.0) måste du göra importen så här:

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


Gammalt svar:

Detta må kanske inte vara den bästa lösningen, men om du installerar denna version :

npm install [email 

du kan nu använda raden nedan utan fel.

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

Svar #7

Node.js har inte implementerat fetch()-metoden, men du kan använda ett av de externa modulerna för denna fantastiska exekveringsmiljö för JavaScript.

I ett av de andra svaren nämns "node-fetch" och det är ett bra val.

I din projektmapp (mappen där du har .js-skripten) installera det där modulen med kommandot:

npm i node-fetch --save

Använd det sedan som en konstant i det skript du vill köra med Node.js, något i stil med detta:

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

Svar #8

Du bör lägga till denna import i din fil:

import * as fetch from 'node-fetch';

Och sedan, kör denna kod för att lägga till node-fetch:
$ yarn add node-fetch

Om du arbetar med TypeScript, installera då node-fetch-typer:
$ yarn add @types/node-fetch

Relaterade artiklar