ReferenceError: fetch tidak didefinisikan

177

Saya memiliki kesalahan ini ketika saya mengkompilasi kode saya di node.js, bagaimana saya bisa memperbaikinya?

RefernceError: fetch tidak didefinisikan

masukkan deskripsi gambar di sini

Ini adalah fungsi yang saya lakukan, bertanggung jawab untuk memulihkan informasi dari basis data film tertentu.

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
sumber
4
Selamat datang di SO, berikan detail tentang apa yang sudah Anda coba sejauh ini? Harap berikan contoh Minimal, Lengkap, dan Terverifikasi di mana pun diperlukan. Juga silakan meluangkan waktu untuk membaca How to Ask
pratibha
3
fetchbukan metode simpuljs standar - yang Anda butuhkannode-fetch
Jaromanda X
3
fetch()dirancang untuk browser dan kemudian kembali-porting ke node.js di modul pihak ketiga yang tampaknya Anda hilang. The request()atau request-promise()perpustakaan lebih native dibangun untuk node.js dan mendukung berbagai lebih luas pilihan untuk node.js termasuk aliran, metode otentikasi miliaran, dll ...
jfriend00

Jawaban:

316

The mengambil API tidak dilaksanakan di Node.

Anda perlu menggunakan modul eksternal untuk itu, seperti ambil-simpul .

Instal di aplikasi Node Anda seperti ini

npm i node-fetch --save

lalu letakkan baris di bawah ini di bagian atas file tempat Anda menggunakan API ambil:

const fetch = require("node-fetch");
Adrian T
sumber
21
vardapat diubah, saya akan merekomendasikan yang constharus digunakan sebagai gantinya ...
Edwin Pratt
3
@ jasa1704 dapatkah Anda memilih jawabannya?
tecnocrata
36

Jika harus dapat diakses dengan cakupan global

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

Ini adalah perbaikan kotor cepat, cobalah untuk menghilangkan penggunaan dalam kode produksi.

Lorem Ipsum Dolor
sumber
1
Ini adalah satu-satunya cara saya bisa mendapatkan WebStorm untuk mengenali janji yang dikembalikan oleh fetchdan melengkapi metode yang tersedia secara otomatis. Setuju bahwa itu harus dihindari dalam produksi, tetapi sangat membantu bagi pengembang lokal!
FoxMulder900
18

Anda bisa menggunakan cross-fetch dari @lquixada

Platform agnostik: peramban, simpul, atau reaksi asli

Install

npm install --save cross-fetch

Pemakaian

Dengan janji:

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

Dengan async / menunggu:

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
sumber
Ini membantu api metaweather, dijelaskan dengan baik dalam dokumentasi github. Terima kasih telah Berbagi
krupesh Anadkat
Menggunakan polyfill crossfetch juga bekerja untuk saya menggunakan naskah dan node dan menerima ReferenceError: fetch is not definedkesalahan dari amazon-cognito-identity-js.
John Hamelink
7

Bagi mereka yang juga menggunakan naskah pada node-js dan mendapatkan ReferenceError: fetch is not definedkesalahan

npm install paket-paket ini:

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

Kemudian termasuk:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');
closedloop
sumber
28
amazon-cognito-identity-jstidak relevan dengan pertanyaan ini dan tidak perlu dipasang untuk menyelesaikan kesalahan ini. Ini juga tidak terkait dengan naskah.
cnvzmxcvmcx
Hai! Jadi saya mengalami masalah yang sama persis, tetapi ini masih belum memperbaiki apa pun, apakah Anda memiliki pekerjaan lain?
Masnad Nihit
5

Anda harus menggunakan isomorphic-fetchmodul untuk Nodeproyek Anda karena Nodebelum mengandung Fetch API. untuk memperbaiki masalah ini jalankan perintah di bawah ini:

npm install --save isomorphic-fetch es6-promise

Setelah instalasi gunakan kode di bawah ini dalam proyek Anda:

import "isomorphic-fetch"

Semoga jawaban ini membantu Anda.

Amerika
sumber
6
Tidak dipelihara secara aktif; telah bertahun-tahun sejak PR terakhir diterima. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer
5

Yang terbaik adalah perpustakaan Axios untuk mengambil. gunakan npm i --save axiosuntuk installng dan gunakan seperti fetch, cukup tulis axios alih-alih fetch lalu dapatkan respons di () .

Mohammad Quanit
sumber
4

Node.js belum menerapkan metode fetch (), tetapi Anda dapat menggunakan salah satu modul eksternal dari lingkungan eksekusi yang fantastis ini untuk JavaScript.

Dalam salah satu jawaban di atas, "ambil simpul" dikutip dan itu pilihan yang baik.

Di folder proyek Anda (direktori tempat Anda memiliki skrip .js) instal modul itu dengan perintah:

npm saya mengambil simpul --simpan

Kemudian gunakan sebagai konstanta dalam skrip yang ingin Anda jalankan dengan Node.js, sesuatu seperti ini:

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

Miguel Murillo
sumber
2

Ini adalah masalah github terkait Bug ini terkait dengan versi 2.0.0, Anda dapat menyelesaikannya dengan hanya memutakhirkan ke versi 2.1.0. Anda bisa lari npm i [email protected]

asma
sumber
0

Berikut ini berfungsi untuk saya di Node.js 12.x:

npm i node-fetch;

untuk menginisialisasi instance Dropbox:

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

untuk misalnya mengunggah konten (metode asinkron yang digunakan dalam kasus ini):

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