ReferenceError: tìm nạp không được xác định


177

Tôi gặp lỗi này khi biên dịch mã của mình trong tệp node.js, làm cách nào để khắc phục?

RefernceError: tìm nạp không được xác định

nhập mô tả hình ảnh ở đây

Đây là chức năng tôi đang làm, nó chịu trách nhiệm khôi phục thông tin từ cơ sở dữ liệu phim cụ thể.

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
Chào mừng bạn đến với SO, vui lòng cung cấp các chi tiết về những gì bạn đã cố gắng cho đến nay? Vui lòng cung cấp một ví dụ tối thiểu, đầy đủ và có thể kiểm chứng bất cứ nơi nào cần thiết. Ngoài ra, vui lòng dành thời gian để đọc Cách hỏi
pratibha

3
fetchkhông phải là một phương thức nodejs tiêu chuẩn - bạn cầnnode-fetch
Jaromanda X

3
fetch()được thiết kế cho trình duyệt và sau đó được chuyển ngược lại sang node.js trong mô-đun của bên thứ ba mà bạn dường như đang thiếu. Các request()hoặc request-promise()thư viện được natively hơn xây dựng cho Node.js và hỗ trợ một phạm vi rộng hơn các tùy chọn cho Node.js bao gồm suối, một zillion phương pháp xác thực, vv ...
jfriend00

Câu trả lời:


314

Các lấy API không được thực hiện trong Node.

Bạn cần sử dụng một mô-đun bên ngoài cho điều đó, như tìm nạp nút .

Cài đặt nó trong ứng dụng Node của bạn như thế này

npm i node-fetch --save

sau đó đặt dòng bên dưới ở đầu các tệp mà bạn đang sử dụng API tìm nạp:

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

21
varcó thể thay đổi, tôi khuyên bạn constnên sử dụng thay thế ...
Edwin Pratt

3
@ jasa1704 bạn có thể vui lòng chọn một câu trả lời?
tecnocata

36

Nếu nó phải được truy cập với phạm vi toàn cầu

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

Đây là một sửa chữa bẩn nhanh chóng, cố gắng loại bỏ việc sử dụng trong mã sản xuất.


1
Đây là cách duy nhất mà tôi có thể khiến WebStorm nhận ra lời hứa được trả lại fetchvà tự động hoàn thành các phương thức có sẵn. Đồng ý rằng nó nên được tránh trong sản xuất, nhưng rất hữu ích cho các nhà phát triển địa phương!
FoxMulder900

18

Bạn có thể sử dụng tìm nạp chéo từ @lquixada

Nền tảng bất khả tri: trình duyệt, nút hoặc phản ứng tự nhiên

Tải về

npm install --save cross-fetch

Sử dụng

Với lời hứa:

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

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

Điều này đã giúp cho metaweather api, được giải thích tốt trong tài liệu github. Cảm ơn đã chia sẻ
krupesh Anadkat

Sử dụng polyfill của crossfetch cũng hoạt động với tôi bằng cách sử dụng bản in và nút và nhận ReferenceError: fetch is not definedlỗi từamazon-cognito-identity-js .
John Hamelink

7

Đối với những người cũng sử dụng bản in trên nút-js và đang gặp ReferenceError: fetch is not definedlỗi

npm install những gói này:

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

Sau đó bao gồm:

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

28
amazon-cognito-identity-jskhông liên quan đến câu hỏi này và không cần cài đặt để giải quyết lỗi này. Nó cũng không liên quan đến bản thảo.
cnvzmxcvmcx

Chào! Vì vậy, tôi đang có cùng một vấn đề, nhưng điều này vẫn không khắc phục được gì, bạn có cách nào khác không?
Masnad Nihit

5

Bạn phải sử dụng isomorphic-fetchmô-đun cho Nodedự án của bạn vì Nodechưa chứa Fetch API. để khắc phục sự cố này, hãy chạy bên dưới lệnh:

npm install --save isomorphic-fetch es6-promise

Sau khi cài đặt sử dụng mã dưới đây trong dự án của bạn:

import "isomorphic-fetch"

Hy vọng câu trả lời này sẽ giúp bạn.


6
Không tích cực duy trì; đã được nhiều năm kể từ lần PR được chấp nhận cuối cùng. github.com/matthew-andrews/isomorphic-fetch/graphs/contologists
tomByrer

5

Tốt nhất là thư viện Axios để tìm nạp. sử dụng npm i --save axioscho installng và sử dụng nó như tìm nạp, chỉ cần viết axios thay vì tìm nạp và sau đó nhận được phản hồi sau đó () .


4

Node.js chưa triển khai phương thức fetch (), nhưng bạn có thể sử dụng một trong các mô-đun bên ngoài của môi trường thực thi tuyệt vời này cho JavaScript.

Trong một trong những câu trả lời ở trên, "nút tìm nạp" được trích dẫn và đó là một lựa chọn tốt.

Trong thư mục dự án của bạn (thư mục nơi bạn có tập lệnh .js) cài đặt mô-đun đó bằng lệnh:

npm i nút tìm nạp - lưu

Sau đó, sử dụng nó như một hằng số trong tập lệnh mà bạn muốn thực thi với Node.js, đại loại như thế này:

const fetch = Yêu cầu ("nút-tìm nạp");


1

Đây là vấn đề github liên quan Lỗi này liên quan đến phiên bản 2.0.0, bạn có thể giải quyết nó bằng cách nâng cấp lên phiên bản 2.1.0. Bạn có thể chạy npm i graphql-request@2.1.0-next.1


0

Các công việc sau đây đối với tôi trong Node.js 12.x:

npm i node-fetch;

để khởi tạo thể hiện Dropbox:

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

ví dụ: tải lên một nội dung (một phương pháp không đồng bộ được sử dụng trong trường hợp này):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.