ReferenceError:未定义fetch

时间:2018-01-25 00:22:21

标签: javascript node.js

我在node.js中编译代码时遇到此错误,如何解决?

RefernceError:未定义提取

enter image description here

这是我正在做的功能,它负责从特定电影数据库中恢复信息。

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

17 个答案:

答案 0 :(得分:84)

节点中未实现fetch API

您需要使用外部模块,例如node-fetch

将其安装在您的Node应用程序中,如下所示

npm i node-fetch --save

然后将下面的行放在使用fetch API的文件的顶部:

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

答案 1 :(得分:10)

如果必须在全局范围内访问它

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

这是一个快速的肮脏修复程序,请尝试消除生产代码中的使用。

答案 2 :(得分:7)

Node.js尚未实现fetch()方法,但是您可以将这种出色的执行环境的外部模块之一用于JavaScript。

在上面的答案之一中,引用了“ node-fetch”,这是一个不错的选择。

在项目文件夹(包含.js脚本的目录)中,使用以下命令安装该模块:

npm i节点获取-保存

然后将其用作要使用Node.js执行的脚本中的常量,如下所示:

const fetch = require(“ node-fetch”);

答案 3 :(得分:5)

您可以使用cross-fetch中的@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);
  });

使用异步/等待:

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

答案 4 :(得分:5)

对于 CORS 请求,似乎使用“http”或“https”获取支持 URL 方案。

安装节点获取库npm install node-fetch,读取文件并解析为json。

const fs = require('fs')
const readJson = filename => {
  return new Promise((resolve, reject) => {
    if (filename.toLowerCase().endsWith(".json")) {
      fs.readFile(filename, (err, data) => {
        if (err) {
          reject(err)
          return
        }
        resolve(JSON.parse(data))
      })
    }
    else {
      reject(new Error("Invalid filetype, <*.json> required."))
      return
    }
  })
}

// usage
const filename = "../data.json"
readJson(filename).then(data => console.log(data)).catch(err => console.log(err.message))

答案 5 :(得分:5)

您应在文件中添加此导入:

import * as fetch from 'node-fetch';

然后,运行以下代码以添加node-fetch

yarn add node-fetch

答案 6 :(得分:3)

由于Node还不包含Node,因此必须在Fetch API项目中使用isomorphic-fetch模块。要解决此问题,请运行以下命令:

npm install --save isomorphic-fetch es6-promise

安装后,在项目中使用以下代码:

import "isomorphic-fetch"

希望这个答案对您有帮助。

答案 7 :(得分:2)

在 node.js 中,您可以使用:node-fetch

npm i node-fetch

然后:

'use strict'

const fetch = require('node-fetch')

这是(nodejs)中的完整示例:

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

const fetchData = async () => {
  const res = await fetch("https://restcountries.eu/rest/v2/alpha/col"); // fetch() returns a promise, so we need to wait for it

  const country = await res.json(); // res is now only an HTTP response, so we need to call res.json()

  console.log(country); // Columbia's data will be logged to the dev console
};

fetchData();

答案 8 :(得分:2)

在 HackerRank 中,一些库是默认安装的,而另一些则没有。

因为它运行的是 Node.js,所以默认情况下没有安装 fetch API

最好的办法是检查库是否已安装。

在练习的顶部,有以下内容:

const https = require('https');

也请尝试将此添加到顶部:

const axios = require('axios');

然后运行代码。

如果出现编译错误,则不可用,否则可以使用axios,这是fetch的一个很好的替代

要将其与 then 一起使用,您可以:

function getMovieTitles(substr){
  axios.get(url)
    .then(function(response){
      console.log(response.data);
    })
}

或利用 async/await

async function getMovieTitles(substr){
  let response = await axios.get(url)
  console.log(response.data);
}

答案 9 :(得分:2)

这是相关的github issue 此错误与2.0.0版本有关,您可以通过简单地升级到2.1.0版本来解决。 你可以跑 npm i graphql-request@2.1.0-next.1

答案 10 :(得分:2)

对于也在 node-js 上也使用 typescript 的用户,并且遇到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');

答案 11 :(得分:2)

最好的是Axios库以进行提取。 使用npm i --save axios进行安装,并像提取一样使用它,只需编写axios而不是提取,然后在 then()中获得响应。

答案 12 :(得分:1)

以下内容在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>
});

答案 13 :(得分:0)

如果要避免安装npm并且不在浏览器中运行,还可以使用nodejs https模块;

const https = require('https')
const url = "https://jsonmock.hackerrank.com/api/movies";
https.get(url, res => {
  let data = '';
  res.on('data', chunk => {
    data += chunk;
  });
  res.on('end', () => {
    data = JSON.parse(data);
    console.log(data);
  })
}).on('error', err => {
  console.log(err.message);
})

答案 14 :(得分:0)

对我来说,这些看起来更简单。

npm install node-fetch
import fetch from "node-fetch";

答案 15 :(得分:0)

实际上有很多不同的库可以使 fetch 在浏览器中可用。

我所知道的主要有:

我目前使用 node-fetch,它运行良好,但我真的不知道哪个是“最好的”。 (尽管我链接的 openbase.com 页面提供了一些有关使用情况的元数据 [例如 Github 星标、npm 下载],这可以提供帮助)

答案 16 :(得分:-2)

可能听起来很傻,但我只是在错误的项目中调用了 npm i node-fetch --save。确保您位于正确的目录中。