ReferenceError: fetch nie jest zdefiniowany

177

Mam ten błąd podczas kompilowania kodu w node.js, jak mogę to naprawić?

RefernceError: fetch nie jest zdefiniowany

wprowadź opis obrazu tutaj

To jest funkcja, którą wykonuję, jest ona odpowiedzialna za odzyskiwanie informacji z konkretnej bazy danych filmów.

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);
  });   
}
jasa1704
źródło
4
Witamy w SO. Proszę podać szczegółowe informacje o tym, co próbowałeś do tej pory? W razie potrzeby podaj przykład minimalny, kompletny i możliwy do zweryfikowania . Poświęć również trochę czasu na przeczytanie How to Ask
pratibha
3
fetchnie jest standardową metodą nodejs - potrzebujesznode-fetch
Jaromanda X
3
fetch()został zaprojektowany dla przeglądarki, a następnie przeniesiony do node.js w module strony trzeciej, którego najwyraźniej brakuje. request()Lub request-promise()biblioteka jest bardziej natywnie zbudowany node.js i obsługuje znacznie szerszy zakres opcji dla node.js tym strumieni, a metod uwierzytelniania zillion, etc ...
jfriend00

Odpowiedzi:

316

API pobrać nie jest realizowany w węźle.

Musisz do tego użyć zewnętrznego modułu, takiego jak pobieranie węzłów .

Zainstaluj go w swojej aplikacji Node w ten sposób

npm i node-fetch --save

następnie umieść poniższy wiersz na górze plików, w których używasz interfejsu API pobierania:

const fetch = require("node-fetch");
Adrian T.
źródło
21
varjest zmienna, polecam constją zamiast tego ...
Edwin Pratt
3
@ jasa1704 czy mógłbyś wybrać odpowiedź?
tecnocrata
36

Jeśli ma być dostępny w zasięgu globalnym

global.fetch = require("node-fetch");

Jest to szybka, brudna poprawka, spróbuj wyeliminować użycie w kodzie produkcyjnym.

Lorem Ipsum Dolor
źródło
1
To był jedyny sposób, w jaki mogłem sprawić, by WebStorm rozpoznał obietnicę zwróconą przez fetchi automatycznie uzupełnił dostępne metody. Zgodziłem się, że należy tego unikać w produkcji, ale jest to bardzo pomocne dla lokalnego dewelopera!
FoxMulder900,
18

Możesz użyć pobierania krzyżowego z @lquixada

Niezależność od platformy: przeglądarki, natywne węzły lub reaguj

zainstalować

npm install --save cross-fetch

Stosowanie

Z obietnicami:

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

Z 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);
  }
})();
Richard Vergis
źródło
Pomogło to w metaweather api, dobrze wyjaśnionym w dokumentacji Github. Dzięki za udostępnienie
krupesh Anadkat,
Użycie polyfetch crossfetch działało również dla mnie przy użyciu skryptu maszynowego i węzła oraz otrzymywania ReferenceError: fetch is not definedbłędu z amazon-cognito-identity-js.
John Hamelink
7

Dla tych, którzy również używają maszynopisu na node-js i otrzymują ReferenceError: fetch is not definedbłąd

npm install te pakiety:

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

Następnie uwzględnij:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');
pętla zamknięta
źródło
28
amazon-cognito-identity-jsnie dotyczy tego pytania i nie trzeba go instalować, aby rozwiązać ten błąd. Nie jest to również związane z maszynopisem.
cnvzmxcvmcx
Cześć! Więc mam dokładnie ten sam problem, ale to nadal niczego nie rozwiązuje, czy masz jakieś inne rozwiązanie?
Masnad Nihit
5

Musisz użyć isomorphic-fetchmodułu do swojego Nodeprojektu, ponieważ Nodenie zawiera Fetch APIjeszcze. aby rozwiązać ten problem, uruchom poniższe polecenie:

npm install --save isomorphic-fetch es6-promise

Po instalacji użyj poniższego kodu w swoim projekcie:

import "isomorphic-fetch"

Mam nadzieję, że ta odpowiedź ci pomoże.

AmerllicA
źródło
6
Nie jest aktywnie utrzymywany; minęło wiele lat od ostatniego zaakceptowanego PR. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer
5

Najlepsza jest biblioteka Axios do pobierania. posługiwać sięnpm i --save axios do installng i używaj go jak pobierania, po prostu napisz axios zamiast pobierania, a następnie uzyskaj odpowiedź w then () .

Mohammad Quanit
źródło
4

Node.js nie zaimplementował metody fetch (), ale możesz użyć jednego z zewnętrznych modułów tego fantastycznego środowiska wykonawczego dla JavaScript.

W jednej z powyższych odpowiedzi przytoczono „pobieranie węzłów” i to jest dobry wybór.

W folderze swojego projektu (katalogu, w którym masz skrypty .js) zainstaluj ten moduł za pomocą polecenia:

npm i node-fetch --save

Następnie użyj go jako stałej w skrypcie, który chcesz wykonać za pomocą Node.js, na przykład:

const fetch = require ("pobieranie węzłów");

Miguel Murillo
źródło
2

To jest powiązany problem z githubem. Ten błąd jest związany z wersją 2.0.0, możesz go rozwiązać, po prostu aktualizując do wersji 2.1.0. Możesz biec npm i [email protected]

asma
źródło
0

Poniższe działa dla mnie w Node.js 12.x:

npm i node-fetch;

aby zainicjować instancję Dropbox:

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

aby np. załadować treść (metoda asynchroniczna używana w tym przypadku):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});
Pavel Muzik
źródło