ReferenceError: il recupero non è definito


177

Ho questo errore quando compilo il mio codice in node.js, come posso ripararlo?

RefernceError: il recupero non è definito

inserisci qui la descrizione dell'immagine

Questa è la funzione che sto svolgendo, è responsabile del recupero delle informazioni da un database di film specifico.

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

4
Benvenuto in SO, ti preghiamo di fornire i dettagli su cosa hai provato finora? Fornisci un esempio minimo, completo e verificabile ove richiesto. Inoltre, prenditi del tempo per leggere Come chiedere
pratibha,

3
fetchnon è un metodo nodejs standard - è necessarionode-fetch
Jaromanda X

3
fetch()è stato progettato per il browser e quindi trasferito nuovamente su node.js in un modulo di terze parti apparentemente mancante. La libreria request()or request-promise()è stata creata in modo più nativo per node.js e supporta una gamma molto più ampia di opzioni per node.js inclusi stream, metodi di autenticazione zillion, ecc ...
jfriend00

Risposte:


316

L' API di recupero non è implementata in Nodo.

È necessario utilizzare un modulo esterno per questo, come node-fetch .

Installalo nell'applicazione Node in questo modo

npm i node-fetch --save

quindi inserisci la riga in basso nella parte superiore dei file in cui stai utilizzando l'API di recupero:

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

21
varè modificabile, consiglierei di constusarlo invece ...
Edwin Pratt,

3
@ jasa1704 potresti per favore scegliere una risposta?
tecnocrata,

36

Se deve essere accessibile con un ambito globale

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

Questa è una soluzione rapida e sporca, cerca di eliminare l'uso nel codice di produzione.


1
Questo è stato l'unico modo in cui sono stato in grado di ottenere WebStorm per riconoscere la promessa restituita fetche completare automaticamente i metodi disponibili. Concordato che dovrebbe essere evitato in produzione, ma molto utile per gli sviluppatori locali!
FoxMulder900,

18

Puoi usare il recupero incrociato da @lquixada

Piattaforma agnostica: browser, nodo o reazione nativa

Installare

npm install --save cross-fetch

uso

Con le promesse:

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

Con asincrono / attendi:

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

Ciò ha aiutato l'api metaweather, ben spiegato nella documentazione di Github. Grazie per la condivisione
krupesh Anadkat il

L'uso del polyfill di crossfetch ha funzionato anche per me usando dattiloscritto e nodo e ricevendo l' ReferenceError: fetch is not definederrore da amazon-cognito-identity-js.
John Hamelink,

7

Per quelli che usano anche dattiloscritto su node-js e stanno ottenendo un ReferenceError: fetch is not definederrore

npm install questi pacchetti:

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

Quindi includere:

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

28
amazon-cognito-identity-jsnon è rilevante per questa domanda e non è necessario installarlo per risolvere questo errore. Inoltre non è legato al dattiloscritto.
cnvzmxcvmcx,

Ciao! Quindi sto avendo esattamente lo stesso problema, ma questo non risolve ancora nulla, hai qualche altra soluzione?
Masnad Nihit,

5

Devi usare il isomorphic-fetchmodulo per il tuo Nodeprogetto perché Nodenon contiene Fetch APIancora. per risolvere questo problema eseguire il comando seguente:

npm install --save isomorphic-fetch es6-promise

Dopo l'installazione, utilizzare il codice seguente nel progetto:

import "isomorphic-fetch"

Spero che questa risposta ti aiuti.


6
Non attivamente mantenuto; sono passati anni dall'ultimo PR accettato. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer

5

La migliore è la libreria Axios per il recupero. usa npm i --save axiosper installng e usalo come fetch, scrivi solo axios invece di fetch e poi ottieni risposta in () .


4

Node.js non ha implementato il metodo fetch (), ma puoi usare uno dei moduli esterni di questo fantastico ambiente di esecuzione per JavaScript.

In una delle risposte di cui sopra, viene citato "node-fetch" ed è una buona scelta.

Nella cartella del tuo progetto (la directory in cui hai gli script .js) installa quel modulo con il comando:

npm i node-fetch --save

Quindi utilizzalo come costante nello script che desideri eseguire con Node.js, in questo modo:

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


2

Questo è il problema relativo a github Questo bug è legato alla versione 2.0.0, puoi risolverlo semplicemente aggiornando alla versione 2.1.0. Puoi correre npm i graphql-request@2.1.0-next.1


0

Quanto segue funziona per me in Node.js 12.x:

npm i node-fetch;

per inizializzare l'istanza di Dropbox:

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

ad esempio caricare un contenuto (un metodo asincrono utilizzato in questo caso):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.