ReferenceError: Abruf ist nicht definiert

175

Ich habe diesen Fehler, wenn ich meinen Code in node.js kompiliere. Wie kann ich ihn beheben?

RefernceError: Abrufen ist nicht definiert

Geben Sie hier die Bildbeschreibung ein

Dies ist die Funktion, die ich mache. Sie ist für die Wiederherstellung von Informationen aus einer bestimmten Filmdatenbank verantwortlich.

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
quelle
4
Willkommen bei SO, bitte geben Sie die Details zu dem an, was Sie bisher versucht haben. Bitte geben Sie bei Bedarf ein minimales, vollständiges und überprüfbares Beispiel an . Bitte nehmen Sie sich auch die Zeit, um zu lesen, wie man
fragt
3
fetchist keine Standard-Nodejs-Methode - Sie brauchennode-fetch
Jaromanda X
3
fetch()wurde für den Browser entwickelt und dann in einem Drittanbieter-Modul, das Sie anscheinend vermissen, auf node.js zurückportiert. Die request()oder request-promise()Bibliothek ist nativer für node.js erstellt und unterstützt eine viel größere Auswahl an Optionen für node.js, einschließlich Streams, zig Authentifizierungsmethoden usw.
jfriend00

Antworten:

313

Die Abruf-API ist in Node nicht implementiert.

Sie müssen dafür ein externes Modul wie Node-Fetch verwenden .

Installieren Sie es wie folgt in Ihrer Node-Anwendung

npm i node-fetch --save

Fügen Sie dann die folgende Zeile oben in die Dateien ein, in denen Sie die Abruf-API verwenden:

const fetch = require("node-fetch");
Adrian T.
quelle
21
varist veränderbar, ich würde empfehlen, dass conststattdessen verwendet werden sollte ...
Edwin Pratt
3
@ jasa1704 könntest du bitte eine antwort wählen?
Tecnocrata
36

Wenn es mit einem globalen Bereich zugänglich sein muss

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

Dies ist eine schnelle, schmutzige Lösung. Versuchen Sie, die Verwendung im Produktionscode zu eliminieren.

Lorem Ipsum Dolor
quelle
1
Nur so konnte ich WebStorm dazu bringen, das von zurückgegebene Versprechen zu erkennen fetchund die verfügbaren Methoden automatisch zu vervollständigen. Einverstanden, dass es in der Produktion vermieden werden sollte, aber sehr hilfreich für lokale Entwickler!
FoxMulder900
18

Sie können Cross-Fetch von @lquixada verwenden

Plattformunabhängig: Browser, Knoten oder native Reaktion

Installieren

npm install --save cross-fetch

Verwendung

Mit Versprechungen:

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

Mit async / warte:

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
quelle
Dies half für die Metaweather-API, die in der Github-Dokumentation gut erklärt wurde. Vielen Dank für das Teilen
krupesh Anadkat
Die Verwendung der Polyfill von crossfetch funktionierte auch bei mir mit Typoskript und Knoten und dem Empfang des ReferenceError: fetch is not definedFehlers von amazon-cognito-identity-js.
John Hamelink
7

Für diejenigen, die auch Typoskript auf Node-Js verwenden und eine ReferenceError: fetch is not definedFehlermeldung erhalten

npm install diese Pakete:

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

Dann schließen Sie ein:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');
geschlossener Regelkreis
quelle
28
amazon-cognito-identity-jsist für diese Frage nicht relevant und muss nicht installiert werden, um diesen Fehler zu beheben. Es ist auch nicht mit Typoskript verwandt.
cnvzmxcvmcx
Hallo! Ich habe also genau das gleiche Problem, aber das behebt immer noch nichts. Haben Sie noch andere Probleme?
Masnad Nihit
5

Sie müssen das isomorphic-fetchModul für Ihr NodeProjekt verwenden, da es Nodenoch nicht enthält Fetch API. Um dieses Problem zu beheben, führen Sie den folgenden Befehl aus:

npm install --save isomorphic-fetch es6-promise

Verwenden Sie nach der Installation den folgenden Code in Ihrem Projekt:

import "isomorphic-fetch"

Hoffe diese Antwort hilft dir.

AmerllicA
quelle
6
Nicht aktiv gepflegt; ist Jahre her seit der letzten akzeptierten PR. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer
5

Am besten ist die Axios-Bibliothek zum Abrufen. Verwenden Sie es npm i --save axiosfür die Installation und verwenden Sie es wie Fetch. Schreiben Sie einfach Axios anstelle von Fetch und erhalten Sie dann eine Antwort in then () .

Mohammad Quanit
quelle
4

Node.js hat die fetch () -Methode nicht implementiert, aber Sie können eines der externen Module dieser fantastischen Ausführungsumgebung für JavaScript verwenden.

In einer der obigen Antworten wird "Node-Fetch" zitiert, und das ist eine gute Wahl.

Installieren Sie dieses Modul in Ihrem Projektordner (dem Verzeichnis, in dem Sie die .js-Skripte haben) mit dem folgenden Befehl:

npm i node-fetch --save

Verwenden Sie es dann als Konstante in dem Skript, das Sie mit Node.js ausführen möchten.

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

Miguel Murillo
quelle
1

Dies ist das verwandte Github- Problem. Dieser Fehler hängt mit der Version 2.0.0 zusammen. Sie können ihn beheben , indem Sie einfach auf Version 2.1.0 aktualisieren. Du kannst rennen npm i [email protected]

asma
quelle
0

Folgendes funktioniert für mich in Node.js 12.x:

npm i node-fetch;

So initialisieren Sie die Dropbox-Instanz:

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

um zB einen Inhalt hochzuladen (eine in diesem Fall verwendete asynchrone Methode):

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