ReferenceError: การดึงข้อมูลไม่ได้ถูกกำหนดไว้


177

ฉันมีข้อผิดพลาดนี้เมื่อฉันรวบรวมรหัสใน node.js ฉันจะแก้ไขได้อย่างไร

RefernceError: fetch ไม่ได้ถูกกำหนดไว้

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือฟังก์ชั่นที่ฉันทำมันมีหน้าที่ในการกู้คืนข้อมูลจากฐานข้อมูลภาพยนตร์เฉพาะ

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
ยินดีต้อนรับสู่ดังนั้นโปรดให้รายละเอียดเกี่ยวกับสิ่งที่คุณได้ลองมาแล้ว? โปรดให้ตัวอย่างที่น้อยที่สุดสมบูรณ์และตรวจสอบได้ทุกที่ที่ต้องการ และโปรดสละเวลาอ่านวิธีถาม
pratibha

3
fetchไม่ใช่วิธี nodejs มาตรฐาน - คุณต้องการnode-fetch
Jaromanda X

3
fetch()ได้รับการออกแบบมาสำหรับเบราว์เซอร์และกลับไปยัง node.js ในโมดูลบุคคลที่สามซึ่งดูเหมือนว่าคุณขาดหายไป request()หรือrequest-promise()ห้องสมุดที่ถูกสร้างขึ้นโดยกำเนิดมากขึ้นสำหรับ Node.js และสนับสนุนช่วงกว้างมากของตัวเลือกสำหรับ Node.js รวมทั้งลำธารเป็น zillion วิธีการตรวจสอบ ฯลฯ ...
jfriend00

คำตอบ:


316

เรียก APIไม่ได้ดำเนินการในโหนด

คุณจำเป็นต้องใช้โมดูลภายนอกสำหรับว่าเหมือนโหนดสามารถดึงข้อมูล

ติดตั้งในแอปพลิเคชันโหนดของคุณเช่นนี้

npm i node-fetch --save

จากนั้นวางบรรทัดด้านล่างที่ด้านบนของไฟล์ที่คุณใช้ fetch API:

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

21
varอาจเปลี่ยนแปลงได้ฉันขอแนะนำให้constใช้แทน ...
Edwin Pratt

3
@ jasa1704 คุณช่วยเลือกคำตอบได้ไหม?
tecnocrata

36

หากจะต้องสามารถเข้าถึงได้ด้วยขอบเขตทั่วโลก

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

นี่คือการแก้ไขที่สกปรกอย่างรวดเร็วพยายามกำจัดการใช้งานในรหัสการผลิต


1
นี่เป็นวิธีเดียวที่ฉันสามารถรับ WebStorm เพื่อรับรู้สัญญาที่ส่งคืนโดยfetchและเติมวิธีการที่มีให้โดยอัตโนมัติ ตกลงว่าควรหลีกเลี่ยงในการผลิต แต่มีประโยชน์มากสำหรับนักพัฒนาในท้องถิ่น!
FoxMulder900

18

คุณสามารถใช้การดึงข้อมูลจาก@lquixada

ผู้ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์ม: เบราว์เซอร์โหนดหรือตอบสนองพื้นเมือง

ติดตั้ง

npm install --save cross-fetch

การใช้

ด้วยสัญญา:

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

ด้วย async / รอ:

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

สิ่งนี้ช่วยให้ metaweather api อธิบายได้ดีในเอกสาร GitHub ขอบคุณสำหรับการแบ่งปัน
krupesh Anadkat

polyfill ใช้ crossfetch ยังทำงานให้ฉันใช้ typescript และโหนดและได้รับข้อผิดพลาดจากReferenceError: fetch is not defined amazon-cognito-identity-js
John Hamelink

7

สำหรับผู้ที่ยังใช้typescriptบนnode-jsและได้รับReferenceError: fetch is not definedข้อผิดพลาด

npm install แพ็คเกจเหล่านี้:

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

จากนั้นรวมถึง:

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

28
amazon-cognito-identity-jsไม่เกี่ยวข้องกับคำถามนี้และไม่จำเป็นต้องติดตั้งเพื่อแก้ไขข้อผิดพลาดนี้ มันไม่เกี่ยวข้องกับ typescript
cnvzmxcvmcx

Hi! ดังนั้นฉันกำลังมีปัญหาเดียวกัน แต่ยังคงไม่แก้ไขอะไรคุณมีงานอื่น ๆ รอบ?
Masnad Nihit

5

คุณต้องใช้isomorphic-fetchโมดูลที่คุณNodeโครงการเพราะNodeไม่ได้มีFetch APIเลย สำหรับการแก้ไขปัญหานี้เรียกใช้คำสั่งด้านล่าง:

npm install --save isomorphic-fetch es6-promise

หลังจากติดตั้งใช้รหัสด้านล่างในโครงการของคุณ:

import "isomorphic-fetch"

หวังว่าคำตอบนี้จะช่วยคุณ


6
ไม่ได้รับการบำรุงรักษาอย่างแข็งขัน; เป็นเวลาหลายปีนับตั้งแต่ที่ PR ได้รับการยอมรับครั้งล่าสุด github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer

5

หนึ่งที่ดีที่สุดคือห้องสมุด Axios สำหรับดึง ใช้npm i --save axiosสำหรับ installng และใช้มันเหมือนดึงข้อมูลเพียงเขียน Axios แทนการดึงข้อมูลแล้วได้รับการตอบสนองในแล้ว ()


4

Node.js ยังไม่ได้ใช้วิธีการดึงข้อมูล () แต่คุณสามารถใช้หนึ่งในโมดูลภายนอกของสภาพแวดล้อมการทำงานที่ยอดเยี่ยมสำหรับ JavaScript

หนึ่งในคำตอบข้างต้น "node-fetch" ถูกอ้างถึงและเป็นตัวเลือกที่ดี

ในโฟลเดอร์โครงการของคุณ (ไดเรกทอรีที่คุณมีสคริปต์. js) ติดตั้งโมดูลนั้นด้วยคำสั่ง:

npm i ดึงโหนด - บันทึก

จากนั้นใช้เป็นค่าคงที่ในสคริปต์ที่คุณต้องการเรียกใช้งานด้วย Node.js ดังนี้:

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


2

นี่คือปัญหา github ที่เกี่ยวข้อง ข้อผิดพลาดนี้เกี่ยวข้องกับรุ่น 2.0.0 คุณสามารถแก้ไขได้โดยเพียงอัปเกรดเป็นเวอร์ชัน 2.1.0 คุณสามารถเรียกใช้ npm i graphql-request@2.1.0-next.1


0

งานต่อไปนี้สำหรับฉันใน Node.js 12.x:

npm i node-fetch;

เพื่อเริ่มต้นอินสแตนซ์ Dropbox:

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

เพื่อเช่นอัปโหลดเนื้อหา (วิธีอะซิงโครนัสที่ใช้ในกรณีนี้):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.